Windows Phone 7 自定义控件库

fmms 12年前

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;              }          }      }  }