2010-01-21 84 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