Question

J'utilise le contrôle Infragistics XamDateTimeEditor et je souhaite y ajouter une propriété de dépendance afin de permettre au développeur de choisir d'avoir tout le texte sélectionné lorsque le contrôle obtient le focus. J'ai créé un style utilisé pour définir le comportement souhaité, mais je souhaite que le développeur décide si le comportement doit être exécuté en fonction d'une propriété de dépendance booléenne. Je ne sais pas comment cela se fait.

Était-ce utile?

La solution

Je suppose que vous avez hérité de XamDateTimeEditor pour cela.

Si vous pouvez écrire le code faisant référence à un "standard" (clr) propriété, alors vous êtes prêt à partir:

  1. déclarez votre DependencyProperty
  2. supprimez votre champ de sauvegarde et remplacez l'implémentation de la propriété standard afin qu'elle accède à DependencyProperty au lieu du champ de sauvegarde.

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

Ensuite, lorsque vous accédez à IsSelectOnFocusEnabled dans votre code, la valeur actuelle de la propriété Dependency est renvoyée.

Vous pouvez également le configurer pour recevoir une notification à chaque changement de propriété, mais je ne vois pas pourquoi vous le feriez dans votre cas.

Il existe également une autre option pour cette astuce, qui n'utilise aucun héritage et une propriété attachée si vous le souhaitez.

MISE À JOUR:

OK, puisque cela a été demandé, voici un moyen de réaliser cela pour n’importe quelle zone de texte. Il devrait être facile de traduire en tout événement que vous utilisez pour effectuer cela sur un autre type de contrôle.

    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 façon dont vous l'utilisez est la suivante, par exemple:

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

Ceci vous montre comment configurer la propriété pour activer le comportement et comment la lier à autre chose si besoin est. Notez que cet exemple spécifique n'est pas parfait (si vous faites un onglet, si vous cliquez à l'intérieur du contrôle, la zone de texte a une logique interne qui désélectionne le texte, mais ce n'est qu'un exemple sur la manière d'attacher des comportements à des contrôles via des propriétés attachées). .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top