0

ElementToFocus プロパティで指定されたコントロールにフォーカスを置くリセット ボタンにフォーカス動作をバインドしたい

<Style TargetType="Button" x:Key="Button_Reset" BasedOn="{StaticResource Button_Default}" >
        <Setter Property="ElementToFocus" />
        <Setter Property="behaviors:EventFocusAttachment.ElementToFocus" Value="{Binding ElementName=ElementToFocus}" />
</Style>

コントロール マークアップ:

<Button
    x:Name="button_Clear"
    Style="{DynamicResource Button_Reset}"
    HorizontalAlignment="Right"
    Content="Clear"
    Command="{Binding Path=ClearCommand}"  
    ElementToFocus="textbox_SearchText"
    Margin="0,0,0,7" />

どうすればこれを達成できますか?

4

1 に答える 1

1

私は、あなたがやろうとしていることを達成しようとする添付の動作を作成しました。

添付された動作コード:

public static class ElementFocusBehavior
    {
        public static readonly DependencyProperty ElementToFocusProperty =
            DependencyProperty.RegisterAttached("ElementToFocus", typeof (FrameworkElement), typeof (ElementFocusBehavior), new PropertyMetadata(default(FrameworkElement), PropertyChangedCallback));

        private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var button = dependencyObject as Button;
            if (button == null) return;
            if (button.IsLoaded)
            {
                AddClickHandler(button);
            }
            else
            {
                button.Loaded += ButtonOnLoaded;
            }
        }

        private static void ButtonOnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            var button = (Button) sender;
            button.Loaded -= ButtonOnLoaded;

            AddClickHandler(button);
        }

        static void AddClickHandler(Button button)
        {
            button.Click += ButtonOnClick;
        }

        private static void ButtonOnClick(object sender, RoutedEventArgs routedEventArgs)
        {
            var fe = GetElementToFocus(sender as Button) as FrameworkElement;
            if (fe == null) return;
            fe.Focus();
        }

        public static void SetElementToFocus(Button button, FrameworkElement value)
        {
            button.SetValue(ElementToFocusProperty, value);
        }

        public static FrameworkElement GetElementToFocus(Button button)
        {
            return (FrameworkElement) button.GetValue(ElementToFocusProperty);
        }
    }

ボタンの XAML は次のとおりです。

<Button Content="Reset" local:ElementFocusBehavior.ElementToFocus="{Binding ElementName=TextBoxThree, Path=.}" />

私の MainWindow からのサンプル コード:

<StackPanel>
        <TextBox Name="TextBoxOne" />
        <TextBox Name="TextBoxTwo" />
        <TextBox Name="TextBoxThree" />
        <Button Content="Reset" local:ElementFocusBehavior.ElementToFocus="{Binding ElementName=TextBoxThree, Path=.}" />
    </StackPanel>

基本的に、私がしたことは、

  1. フォーカスされる要素を格納するためのビヘイビアを添付し、
  2. 次に、添付されたビヘイビアで、イベント ハンドラーをボタンの Click イベントに追加し、
  3. ElementToFocusClick イベントで要素に Focus を設定します

お役に立てれば。

于 2013-10-29T18:20:21.347 に答える