8

Infragistics XamDateTimeEditorコントロールを使用していますが、依存関係プロパティを追加して、コントロールがフォーカスを取得したときに開発者がすべてのテキストを選択できるようにします。必要な動作を設定するために使用するスタイルを作成しましたが、ブール依存関係プロパティに基づいて動作を実行するかどうかを開発者に決定してもらいたいです。それがどのように行われるのかわかりません。

4

1 に答える 1

18

このためにXamDateTimeEditorから継承したと思います。

「標準」(clr)プロパティを参照するコードを記述できる場合は、次のようにしてください。

  1. DependencyPropertyを宣言します
  2. バッキングフィールドを削除し、標準プロパティの実装を置き換えて、バッキングフィールドではなく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にアクセスすると、Dependencyプロパティの現在の値が返されます。

プロパティが変更されるたびに通知を受け取るように設定することもできますが、なぜそうなるのかわかりません。

このトリックには別のオプションもあります。必要に応じて、継承を使用せず、添付プロパティを使用します。

アップデート:

OK、リクエストされたので、これを任意のテキストボックスで実現する方法があります。別のタイプのコントロールでそれを実行するために使用するイベントに簡単に変換できるはずです。

    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>

これは、動作をアクティブ化するためにプロパティを設定する方法と、必要に応じてそれを他の何かにバインドする方法を示しています。この特定の例は完全ではないことに注意してください(タブを介して機能する場合、コントロール内をクリックすると、テキストボックスには実際にテキストの選択を解除する内部ロジックがありますが、これはアタッチされたプロパティを介してビヘイビアーをコントロールにアタッチする方法の例にすぎません) 。

于 2009-05-02T23:46:36.180 に答える