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