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();
- thisthis.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;
- }
- }
- }
- }
本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078436