2013-03-06 67 views
5

在我看來,有交融風格Trigger S IN的交互命名空間中找到之間的主要區別,並通過樣式,ControlTemplate S,等現有的經典Trigger秒,在WPF(我假設這可能也適用於SilverLight)。混合觸發與WPF觸發

在WPF中,當您使用Setter設置Trigger時,會出現兩種行爲:如果符合觸發條件,則應用Setter。但是,一旦觸發器不再滿足,則恢復先前的值。這在編程UI時非常有用。

我試着編碼DataTrigger類似地使用混合方式:我將ChangePropertyAction應用到我的控件,並使用綁定到我的ViewModel觸發交互DataTrigger

<Rectangle x:Name="SecondaryHighlightBackground" Fill="#FF505050"> 
      <i:Interaction.Triggers> 
       <ei:DataTrigger Binding="{Binding IsHighlighted}" Value="Value"> 
        <ei:ChangePropertyAction PropertyName="Opacity" Value="0.5"/> 
       </ei:DataTrigger> 
      </i:Interaction.Triggers> 
... 
</Rectangle> 

因此,這和預期一樣......除了我震驚地發現,當我翻轉IsHighlighted值爲false,即0%原始不透明度是不可恢復的(我設置低了下去)。要仔細檢查這一點,我寫了這個例子來驗證:

<Window x:Class="TestWpfApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="Window" 
     Title="MainWindow" 
     Width="640" 
     Height="480"> 

    <Grid x:Name="LayoutRoot"> 
     <Button Name="button1" 
       Width="173" 
       Height="57" 
       Margin="10,10,0,0" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top"> 
      <Button.Style> 
       <Style TargetType="Button"> 
        <Setter Property="Content" Value="foo" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsMouseOver, ElementName=button1}" Value="True"> 
          <Setter Property="Content" Value="bar" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button> 
    </Grid> 
</Window> 

預期的行爲是,如果你如果鼠標按鈕,內容更改爲「巴」。按照樣式指定的方式移動鼠標將內容恢復到'Foo'。樣式設置內容以避免屬性優先問題。

我的問題是:雙向觸發真的只是在Blend擴展中丟失,或者有什麼辦法來啓用它嗎?

我錯過了什麼嗎?我認爲這是觸發器的要點,他們有這種雙向功能。我希望繼續使用Blend交互操作,因爲我覺得它們非常有用且直觀,但這種事情迫使我重新編寫XAML代碼。

回答

1

如果我理解正確,您只需提供觸發器中其他值的考慮因素,因爲您已經控制了該條件,因此默認情況下它不會執行此操作。就像是;

<i:Interaction.Triggers> 
    <ei:DataTrigger Binding="{Binding IsHighlighted}" Value="True"> 
     <ei:ChangePropertyAction PropertyName="Opacity" Value="0.5"/> 
    </ei:DataTrigger> 
    <ei:DataTrigger Binding="{Binding IsHighlighted}" Value="False"> 
     <ei:ChangePropertyAction PropertyName="Opacity" Value="0"/> 
    </ei:DataTrigger> 
</i:Interaction.Triggers> 
+0

雖然這是我的問題 - 我不想硬編碼返回值,我希望它在觸發器被觸發前假設實例值。這就是普通的WPF/Silverlight觸發器的工作原理。 – cunningdave 2013-03-06 23:12:41

+0

我想你可能會說使用'VisualStateManager'的意思,其中指定了一個默認的'State',這樣它就知道它有一個特定的實例可以恢復。但是,當你在WPF或SL中使用觸發器時,我相當肯定你總是必須控制恢復到另一個狀態,因爲當使用狀態而不是觸發器時沒有可用的默認值,因爲你要手動改變它的屬性,除非在不可改變的對象的情況下,你無法改變它。 – 2013-03-07 16:38:12

+0

不,這不是我的意思。我在上面添加了一個簡單的例子來說明正常的觸發行爲。 – cunningdave 2013-03-07 17:30:31