Domanda

Sto usando il controllo Infragistics XamDateTimeEditor e desidero aggiungere una proprietà di dipendenza per consentire allo sviluppatore di scegliere di avere tutto il testo selezionato quando il controllo diventa attivo. Ho creato uno stile che viene utilizzato per impostare il comportamento desiderato, ma voglio che lo sviluppatore decida se il comportamento deve essere eseguito in base a una proprietà di dipendenza booleana. Non sono sicuro di come sia stato fatto.

È stato utile?

Soluzione

Presumo che tu abbia ereditato da XamDateTimeEditor per questo.

Se riesci a scrivere il codice facendo riferimento a " standard " (clr), allora sei a posto:

  1. dichiara la tua DependencyProperty
  2. rimuove il campo di supporto e sostituisce l'implementazione della proprietà standard in modo che acceda a DependencyProperty anziché al campo di supporto.

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

Quindi, quando accedi a IsSelectOnFocusEnabled nel tuo codice, verrà restituito il valore corrente della proprietà Dipendenza.

Puoi anche impostarlo per ricevere notifiche ogni volta che la proprietà cambia, ma non vedo perché lo faresti nel tuo caso.

Esiste anche un'altra opzione per questo trucco, che non utilizza ereditarietà e una proprietà collegata se lo desideri.

UPDATE:

OK, poiché è stato richiesto, ecco un modo per farlo per qualsiasi casella di testo. Dovrebbe essere facile tradurre in qualunque evento tu usi per farlo su un altro tipo di controllo.

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

    }

Il modo in cui lo usi è il seguente, ad esempio:

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

Questo mostra come impostare la proprietà per attivare il comportamento e come associarlo a qualcos'altro, se necessario. Si noti che questo esempio specifico non è perfetto (se si esegue la tabulazione, se si fa clic all'interno del controllo, la casella di testo ha una logica interna che deseleziona effettivamente il testo, ma questo è solo un esempio su come associare comportamenti ai controlli attraverso le proprietà associate) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top