Pregunta

Estoy usando el control Infragistics XamDateTimeEditor y quiero agregarle una propiedad de dependencia para permitir que el desarrollador elija tener todo el texto seleccionado cuando el control se enfoca. He creado un estilo que se usa para establecer el comportamiento que quiero, pero quiero que el desarrollador decida si el comportamiento debe ejecutarse en base a una propiedad de dependencia booleana. No estoy seguro de cómo se hace eso.

¿Fue útil?

Solución

Supongo que heredó de XamDateTimeEditor para esto.

Si puede escribir el código que hace referencia a un " estándar " (clr) propiedad, entonces usted es bueno para ir:

  1. declare su propiedad de dependencia
  2. elimine su campo de respaldo y reemplace la implementación de la propiedad estándar para que acceda a DependencyProperty en lugar del campo de respaldo.

    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);
            }
        }
    }
    

Luego, cuando acceda a IsSelectOnFocusEnabled en su código, devolverá el valor actual de la propiedad de dependencia.

También puede configurarlo para recibir una notificación cada vez que cambie la propiedad, pero no veo por qué lo haría en su caso.

También hay otra opción para este truco, que no usa herencia y una propiedad adjunta si lo desea.

ACTUALIZACIÓN:

Bien, ya que se solicitó, aquí hay una manera de lograr eso para cualquier cuadro de texto. Debería ser fácil traducirlo a cualquier evento que use para llevarlo a cabo en otro tipo de control.

    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();
        }

    }

La forma en que lo usas es la siguiente, por ejemplo:

<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>

Esto le muestra cómo configurar la propiedad para activar el comportamiento y cómo vincularla a otra cosa si es necesario. Tenga en cuenta que este ejemplo específico no es perfecto (si lo hace por medio de una pestaña, si hace clic dentro del control, el cuadro de texto tiene una lógica interna que realmente deselecciona el texto, pero eso es solo un ejemplo sobre cómo adjuntar comportamientos a los controles a través de propiedades adjuntas) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top