Adicionar propriedade de dependência para controlar
-
03-07-2019 - |
Pergunta
Estou usando o Controle do Infragistics XamDateTimeEditor e quero adicionar uma propriedade de dependência para permitir que o desenvolvedor opte por ter todo o texto selecionado quando o controle é foco. Eu criei um estilo usado para definir o comportamento que eu quero, mas quero que o desenvolvedor decida se o comportamento deve ser executado com base em uma propriedade de dependência booleana. Não tenho certeza de como isso é feito.
Solução
Suponho que você herdou do XamdateTimeEditor para isso.
Se você pode escrever o código referenciando uma propriedade "padrão" (CLR), está pronto para ir:
- Declare sua dependênciaProperty
Remova o campo de apoio e substitua a implementação da propriedade padrão para que ele acesse a dependênciaProperty em vez do campo de apoio.
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); } } }
Então, quando você acessa o ISSELECTONFOCUSENabled em seu código, ele retornará o valor atual da propriedade de dependência.
Você também pode configurá -lo para receber notificação sempre que a propriedade mudar, mas não vejo por que você faria no seu caso.
Há também outra opção para esse truque, que não usa herança e uma propriedade anexada, se desejar.
ATUALIZAR:
OK, como foi solicitado, aqui está uma maneira de conseguir isso para qualquer caixa de texto. Deve ser fácil traduzir para qualquer evento que você usar para executá -lo em outro tipo de controle.
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();
}
}
A maneira como você usa é a seguinte, por exemplo:
<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>
Isso mostra como configurar a propriedade para ativar o comportamento e como vinculá -lo a outra coisa, se necessário. Observe que este exemplo específico não é perfeito (se você guiar através dele, se você clicar dentro do controle, a caixa de texto terá lógica interna que realmente desmarque o texto, mas esse é apenas um exemplo de como anexar comportamentos aos controles através de propriedades anexadas) .