2010-01-21 86 views
3

我在将焦点更改为xaml上的某个按钮时出现问题。 我试图做它的代码看起来如下(如果满足一些条件,那么焦点应该设置为按钮。奇怪的是,为了测试目的,我也chaning的按钮的背景,并设置此属性每个条件都满足时,如何设置默认按钮或将焦点设置该按钮?在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只设置如果我点击在特定的按钮上,因为我可以看到这些按钮有焦点

回答

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(); 
     } 
    }); 
} 
+0

好吧,我会尝试,并让你知道,如果它的工作原理 – 2010-01-21 09:22:29

+0

很好,它不工作。 PropertyChangedCallback确实被执行,但焦点仍在另一个按钮上。 – 2010-01-21 09:30:01

+0

它将两个其他按钮的Focusable属性设置为false后工作 – 2010-01-21 09:48:05