wpf - 在 xaml 中改变焦点

标签 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 只有在我单击特定按钮时才会设置。如我所见,这些按钮具有焦点。

最佳答案

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

关于wpf - 在 xaml 中改变焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2107655/

相关文章:

c# - 如何更改 SelectedItem(在 ListBox 中)的颜色?

windows - 如何防止 CWnd 获得焦点?

jquery - 如何使用 jQuery 制作选择下拉列表?

wpf - 递归分层数据模板 (WPF)

c# - 悬停菜单项时更改背景颜色但无法在wpf中显示子菜单

c# - 如何修复网格行和列在 wpf 中不更新?

jQuery 清除焦点上的输入文本

c# - 如何在 WPF 中操作另一个类的窗口对象

c# - 如何使用 MVVM 将焦点设置为 WPF 控件?

wpf - 移动焦点以响应 XAML 中的键盘事件