我在将焦点更改为 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/