3

我在将焦点更改为 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 仅在我单击特定按钮时才设置。正如我所看到的,这些按钮具有焦点。

4

1 回答 1

3

问题是FocusManager.FocusedElement它只控制FocusScope. 由于Button不是它自己的 FocusScope,它没有任何效果。您需要调用 Focus() 方法,这需要您编写一些代码。

您可以做显而易见的事情并编写一个事件处理程序,或者您可以做不明显的事情并创建一个附加属性“MyFocusManager.ForceFocus”,当从 false 转换为 true 时,设置FocusManager.FocusedElement. 这是通过 a 完成的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();
      }
    });
}
于 2010-01-21T08:32:51.520 回答