zoukankan      html  css  js  c++  java
  • Windows Phone 7 自定义控件库

          Windows Phone 7自定义一个控件库跟Silverlight的是基本一样的,第一步创建一个类库,然后添加一个Themes文件夹,在文件夹里面添加上generic.xaml文件作为默认的控件样式文件,记住一定要写这个名字否则就找不到样式了,大小写都可以。新建一个控件类MyContro1.cs,MyContro2.cs在这里面就可以写控件的处理逻辑了。

    下面看一下一个水印控件的处理:

    generic.xaml文件

    <ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local
    ="clr-namespace:Phone.Controls;assembly=Phone.Controls"
    xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable
    ="d"
    >
    <Style TargetType="local:WatermarkedTextBox">
    <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}"/>
    <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}"/>
    <Setter Property="Background" Value="White"/>
    <Setter Property="Foreground" Value="#FF3880B2"/>
    <Setter Property="BorderBrush" Value="#FF3880B2"/>
    <Setter Property="SelectionBackground" Value="#FF3880B2"/>
    <Setter Property="SelectionForeground" Value="{StaticResource PhoneTextBoxSelectionForegroundBrush}"/>
    <Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/>
    <Setter Property="Padding" Value="2"/>
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="local:WatermarkedTextBox">
    <Grid Background="Transparent">
    <VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="CommonStates">
    <VisualState x:Name="Normal"/>
    <VisualState x:Name="MouseOver"/>
    <VisualState x:Name="Disabled">
    <Storyboard>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="EnabledBorder">
    <DiscreteObjectKeyFrame KeyTime="0">
    <DiscreteObjectKeyFrame.Value>
    <Visibility>Collapsed</Visibility>
    </DiscreteObjectKeyFrame.Value>
    </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DisabledOrReadonlyBorder">
    <DiscreteObjectKeyFrame KeyTime="0">
    <DiscreteObjectKeyFrame.Value>
    <Visibility>Visible</Visibility>
    </DiscreteObjectKeyFrame.Value>
    </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
    </Storyboard>
    </VisualState>
    <VisualState x:Name="ReadOnly">
    <Storyboard>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="EnabledBorder">
    <DiscreteObjectKeyFrame KeyTime="0">
    <DiscreteObjectKeyFrame.Value>
    <Visibility>Collapsed</Visibility>
    </DiscreteObjectKeyFrame.Value>
    </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DisabledOrReadonlyBorder">
    <DiscreteObjectKeyFrame KeyTime="0">
    <DiscreteObjectKeyFrame.Value>
    <Visibility>Visible</Visibility>
    </DiscreteObjectKeyFrame.Value>
    </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="DisabledOrReadonlyBorder">
    <DiscreteObjectKeyFrame KeyTime="0" Value="White"/>
    </ObjectAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="DisabledOrReadonlyBorder">
    <DiscreteObjectKeyFrame KeyTime="0" Value="#FF3880B2"/>
    </ObjectAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="DisabledOrReadonlyContent">
    <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneTextBoxReadOnlyBrush}"/>
    </ObjectAnimationUsingKeyFrames>
    </Storyboard>
    </VisualState>
    </VisualStateGroup>
    <VisualStateGroup x:Name="FocusStates">
    <VisualState x:Name="Focused">
    <Storyboard>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="EnabledBorder">
    <DiscreteObjectKeyFrame KeyTime="0" Value="White"/>
    </ObjectAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="EnabledBorder">
    <DiscreteObjectKeyFrame KeyTime="0" Value="#FF3880B2"/>
    </ObjectAnimationUsingKeyFrames>
    </Storyboard>
    </VisualState>
    <VisualState x:Name="Unfocused"/>

    </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Border x:Name="EnabledBorder" BorderBrush="#FF3880B2" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Margin="{StaticResource PhoneTouchTargetOverhang}">
    <Grid>
    <ContentControl x:Name="watermarkContent" HorizontalContentAlignment="Left" Style="{TemplateBinding WatermarkStyle}" Content="{TemplateBinding Watermark}" Background="Transparent" Opacity="0.5"/>
    <ContentControl x:Name="ContentElement" BorderThickness="0" HorizontalContentAlignment="Stretch" Margin="{StaticResource PhoneTextBoxInnerMargin}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="Stretch"/>
    </Grid>
    </Border>
    <Border x:Name="DisabledOrReadonlyBorder" BorderBrush="{StaticResource PhoneDisabledBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="White" Margin="{StaticResource PhoneTouchTargetOverhang}" Visibility="Collapsed">
    <TextBox x:Name="DisabledOrReadonlyContent" Background="White" Foreground="{StaticResource PhoneDisabledBrush}"
    FontWeight
    ="{TemplateBinding FontWeight}" FontStyle="{TemplateBinding FontStyle}" FontSize="{TemplateBinding FontSize}"
    FontFamily
    ="{TemplateBinding FontFamily}" IsReadOnly="True" SelectionForeground="{TemplateBinding SelectionForeground}"
    SelectionBackground
    ="{TemplateBinding SelectionBackground}" TextAlignment="{TemplateBinding TextAlignment}"
    TextWrapping
    ="{TemplateBinding TextWrapping}" Text="{TemplateBinding Text}" Template="{StaticResource PhoneDisabledTextBoxTemplate}" />
    </Border>
    </Grid>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    </Style>

    </ResourceDictionary>

    WatermarkTextBox..cs

    using System.Windows;
    using System.Windows.Controls;

    namespace Phone.Controls
    {
    public class WatermarkedTextBox : TextBox
    {
    ContentControl WatermarkContent;
    public static readonly DependencyProperty WatermarkProperty =
    DependencyProperty.Register("Watermark", typeof(object), typeof(WatermarkedTextBox), new PropertyMetadata(OnWatermarkPropertyChanged));

    public static readonly DependencyProperty WatermarkStyleProperty =
    DependencyProperty.Register("WatermarkStyle", typeof(Style), typeof(WatermarkedTextBox), null);

    public Style WatermarkStyle
    {
    get { return base.GetValue(WatermarkStyleProperty) as Style; }
    set { base.SetValue(WatermarkStyleProperty, value); }
    }

    public object Watermark
    {
    get { return base.GetValue(WatermarkProperty) as object; }
    set { base.SetValue(WatermarkProperty, value); }
    }

    public WatermarkedTextBox()
    {
    DefaultStyleKey = typeof(WatermarkedTextBox);
    }

    public override void OnApplyTemplate()
    {
    base.OnApplyTemplate();
    this.WatermarkContent = this.GetTemplateChild("watermarkContent") as ContentControl;
    if(WatermarkContent != null)
    {
    DetermineWatermarkContentVisibility();
    }
    }

    protected override void OnGotFocus(RoutedEventArgs e)
    {
    if (WatermarkContent != null && string.IsNullOrEmpty(this.Text))
    {
    this.WatermarkContent.Visibility = Visibility.Collapsed;
    }
    base.OnGotFocus(e);
    }

    protected override void OnLostFocus(RoutedEventArgs e)
    {
    if (WatermarkContent != null && string.IsNullOrEmpty(this.Text))
    {
    this.WatermarkContent.Visibility = Visibility.Visible;
    }
    base.OnLostFocus(e);
    }

    private static void OnWatermarkPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
    WatermarkedTextBox watermarkTextBox = sender as WatermarkedTextBox;
    if(watermarkTextBox != null && watermarkTextBox.WatermarkContent !=null)
    {
    watermarkTextBox.DetermineWatermarkContentVisibility();
    }
    }

    private void DetermineWatermarkContentVisibility()
    {
    if (string.IsNullOrEmpty(this.Text))
    {
    this.WatermarkContent.Visibility = Visibility.Visible;
    }
    else
    {
    this.WatermarkContent.Visibility = Visibility.Collapsed;
    }
    }
    }
    }
  • 相关阅读:
    ASP.NET AJAX__序言
    LINQ to SQL(4):OR设计器
    ASP.NET AJAX(11)__ScriptManager
    ASP.NET AJAX(15)__构建高性能ASP.NET AJAX应用
    LINQ to SQL(2):生成对象模型
    LINQ to SQL(3):增删改查
    ASP.NET AJAX(14)__UpdatePanel与服务器端脚本控件
    ASP.NET AJAX(13)__利用Microsoft AJAX Library开发客户端组件
    LINQ to SQL(1):基础入门
    ASP.NET AJAX(12)__浏览器兼容功能
  • 原文地址:https://www.cnblogs.com/linzheng/p/2358728.html
Copyright © 2011-2022 走看看