我正在使用Infragistics XamDateTimeEditor控件,我想为它添加一个依赖项属性,以允许开发人员选择在控件获得焦点时选择所有文本.我创建了一个样式,用于设置我想要的行为,但我希望开发人员决定是否应该基于布尔依赖属性执行行为.我不确定如何做到这一点.
我假设您继承了XamDateTimeEditor.
如果您可以编写引用“标准”(clr)属性的代码,那么您最好去:
>声明您的DependencyProperty
>删除您的支持字段并替换标准属性的实现,以便它访问DependencyProperty而不是支持字段.
public class MyXamDateTimeEditor : XamDateTimeEditor { public static readonly DependencyProperty IsSelectOnFocusEnabledProperty = DependencyProperty.Register("IsSelectOnFocusEnabled",typeof(bool),typeof(MyXamDateTimeEditor),new UIPropertyMetadata(false)); public boolIsSelectOnFocusEnabled { get { return (bool)GetValue(IsSelectOnFocusEnabledProperty); } set { SetValue(IsSelectOnFocusEnabledProperty,value); } } }
然后,当您在代码中访问IsSelectOnFocusEnabled时,它将返回Dependency属性的当前值.
您也可以将其设置为在属性更改时接收通知,但我不明白为什么您会这样做.
这个技巧还有另一种选择,如果你愿意,它不使用继承和附加属性.
更新:
好的,因为它是被请求的,这是一种实现任何文本框的方法.它应该很容易转换为您用于在其他类型的控件上执行的任何事件.
public class TextBoxBehaviors { public static bool GetIsSelectOnFocusEnabled(DependencyObject obj) { return (bool)obj.GetValue(IsSelectOnFocusEnabledProperty); } public static void SetIsSelectOnFocusEnabled(DependencyObject obj,bool value) { obj.SetValue(IsSelectOnFocusEnabledProperty,value); } public static readonly DependencyProperty IsSelectOnFocusEnabledProperty = DependencyProperty.RegisterAttached("IsSelectOnFocusEnabled",typeof(TextBoxBehaviors),new UIPropertyMetadata(false,new PropertyChangedCallback(OnSelectOnFocusChange))); private static void OnSelectOnFocusChange(DependencyObject d,DependencyPropertyChangedEventArgs e) { if (d is TextBox) { var tb = d as TextBox; if ((bool)e.NewValue) { tb.GotFocus += new RoutedEventHandler(tb_GotFocus); } else { tb.GotFocus -= new RoutedEventHandler(tb_GotFocus); } } } static void tb_GotFocus(object sender,RoutedEventArgs e) { var tb = sender as TextBox; tb.SelectAll(); } }
您使用它的方式如下,例如:
<Window x:Class="WpfApplication2.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication2" Title="Window1" Height="300" Width="300"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBox Text="No Select All" x:Name="TextBox1"/> <CheckBox Content="Auto Select" Grid.Column="1" IsChecked="{Binding Path=(local:TextBoxBehaviors.IsSelectOnFocusEnabled),ElementName=TextBox1,Mode=TwoWay}" /> <TextBox Grid.Row="1" Text="djkhfskhfkdssdkj" local:TextBoxBehaviors.IsSelectOnFocusEnabled="true" /> </Grid> </Window>
这将向您展示如何设置属性以激活行为,以及如何在需要时将其绑定到其他内容.请注意,此特定示例并不完美(如果您通过它进行选项卡工作,如果您在控件内部单击,则文本框具有实际取消选择文本的内部逻辑,但这只是关于如何通过附加属性将行为附加到控件的示例) .