在xaml中改变焦点

时间:2010-01-21 07:51:48

标签: wpf xaml focus multidatatrigger

我在将焦点更改为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 个答案:

答案 0 :(得分:3)

问题在于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();
      }
    });
}