2013-10-24 9 views
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" /> 

Как это сделать?

+0

Если кто-то хочет удалить тег стилей и создать wpf-Styles, это было бы здорово. – Chad

+0

Свойство «Значение» на 'Setter' не является dp, поэтому не уверен, что вы можете использовать' Binding' вообще для его установки. – sthotakura

+0

@Sthotakura Я не уверен, что это значит – Chad

ответ

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. в замковом событии установите фокус на элементе ElementToFocus

Надеюсь, что это поможет.