我在将焦点更改为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。正如我所看到的那样,这些按钮具有焦点。
答案 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();
}
});
}