Изменение фокуса в xaml - PullRequest
       9

Изменение фокуса в xaml

3 голосов
/ 21 января 2010

У меня проблема с изменением фокуса на какую-то кнопку на xaml. Код, который я пытаюсь сделать, выглядит следующим образом (если выполняются некоторые условия, фокус должен быть установлен на кнопку. Странно, что для целей тестирования я также изменяю фон кнопки, и это свойство устанавливается каждый время выполнения условий. Как я могу установить кнопку по умолчанию или установить фокус на этой кнопке?

<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
  <MultiDataTrigger>
    <MultiDataTrigger.Conditions>
      <Condition Binding="{Binding Path=SomeProperty1.Count, Converter={StaticResource IntegerToBooleanConverter}}" Value="True"/>
      <Condition Binding="{Binding Path=SomeProperty2, Converter={StaticResource NullToBoolConverter}}" Value="False"/>
      <Condition Binding="{Binding Path=SomeProperty3.Count, Converter={StaticResource IntegerToBooleanConverter}}" Value="True"/> 
    </MultiDataTrigger.Conditions>
    <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}"/>
    <Setter Property="IsDefault" Value="True"/> 
    <Setter Property="Background" Value="Green"/>
  </MultiDataTrigger>
</Style.Triggers>

Кроме того, я хотел бы написать, что SomeProperty1 и SomeProperty2 устанавливаются, только если я нажимаю на конкретную кнопку. Как я вижу, эти кнопки имеют фокус.

1 Ответ

3 голосов
/ 21 января 2010

Проблема в том, что FocusManager.FocusedElement контролирует только локальный фокус в пределах FocusScope. Поскольку Button не является собственным FocusScope, он не имеет никакого эффекта. Вам нужно вызвать метод Focus (), который требует написания кода.

Вы можете сделать очевидное и написать обработчик события, или вы можете сделать неочевидное и создать присоединенное свойство "MyFocusManager.ForceFocus", которое при переходе от false к true устанавливает FocusManager.FocusedElement. Это делается с помощью PropertyChangedCallback, примерно так:

public class MyFocusManager
{
  public static bool GetForceFocus .... // use "propa" snippet to fill this in
  public static void SetForceFocus ....
  public static DependencyProperty ForceFocusProperty = DependencyProperty.RegisterAttached("ForceFocus", typeof(bool), typeof(MyFocusManager),  new UIPropertyMetadata
    {
      PropertyChangedCallback = (obj, e) =>
      {
        if((bool)e.NewValue && !(bool)e.OldValue & obj is IInputElement)
          ((IInputElement)obj).Focus();
      }
    });
}
...