Я предполагаю, что вы унаследовали от 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 в своем коде, он возвращает текущее значение свойства зависимости.
Вы также можете настроить его на получение уведомлений при каждом изменении свойства, но я не понимаю, почему вы бы сделали это в вашем случае.
Существует также другая опция для этого трюка, которая не использует наследование и присоединенное свойство, если хотите.
UPDATE:
ОК, так как это было запрошено, вот способ добиться этого для любого текстового поля. Должно быть легко перенести любое событие, которое вы используете, чтобы выполнить это на другом типе управления.
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(bool),
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>
Здесь показано, как настроить свойство для активации поведения и как связать его с чем-то другим, если это необходимо.
Обратите внимание, что этот конкретный пример не идеален (если вы нажимаете на вкладку, он работает, если вы щелкаете внутри элемента управления, текстовое поле имеет внутреннюю логику, которая фактически отменяет выделение текста, но это всего лишь пример того, как прикрепить поведение к элементам управления через присоединенные свойства) .