2012-05-17 60 views
1

我是WPF的新手,並試圖對更改爲矩形的大小和位置進行動畫處理。我通過將它綁定到INotifyPropertyChanged屬性來設置我的矩形。這工作正常,但變化可以是極端的,我希望它在視覺上不那麼震撼。在WPF中使用帶矩形的DataTrigger時遇到問題

這是工作正常:

<Rectangle Fill="{x:Static SystemColors.ControlBrush}" 
     Stroke="black"> 
<Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Canvas.Left" Value="{Binding Path=Coil.Left, Mode=OneWay}"/> 
     <Setter Property="Canvas.Top" Value="{Binding Path=Coil.Top, Mode=OneWay}"/> 
     <Setter Property="Width" Value="{Binding Path=Coil.Width, Mode=OneWay}"/> 
     <Setter Property="Height" Value="{Binding Path=Coil.Height, Mode=OneWay}"/> 
    </Style> 
</Rectangle.Style> 

Coil.Left是我INotifyPropertyChanged的對象內的的RectangleF結構和含有該矩形在我的代碼後的設定後面我的畫布的DataContext屬性對象被創建。

我也能使用這個一個EventTrigger就好動畫:

<Rectangle Fill="{x:Static SystemColors.ControlBrush}" 
     Stroke="black"> 
<Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Canvas.Left" Value="{Binding Path=Coil.Left, Mode=OneTime}"/> 
     <Setter Property="Canvas.Top" Value="{Binding Path=Coil.Top, Mode=OneTime}"/> 
     <Setter Property="Width" Value="{Binding Path=Coil.Width, Mode=OneTime}"/> 
     <Setter Property="Height" Value="{Binding Path=Coil.Height, Mode=OneTime}"/> 
    </Style> 
</Rectangle.Style> 
<Rectangle.Triggers> 
    <EventTrigger RoutedEvent="Rectangle.MouseEnter"> 
     <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetProperty="Width" 
             To="{Binding Path=Coil.Width, Mode=OneWay}" 
             Duration="0:0:5"/> 
        <DoubleAnimation Storyboard.TargetProperty="Height" 
             To="{Binding Path=Coil.Height, Mode=OneWay}" 
             Duration="0:0:0.5"/> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" 
             To="{Binding Path=Coil.Left, Mode=OneWay}" 
             Duration="0:0:5"/> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" 
             To="{Binding Path=Coil.Top, Mode=OneWay}" 
             Duration="0:0:5"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger.Actions> 
    </EventTrigger> 
</Rectangle.Triggers> 

當我將我的鼠標移到矩形,它通過動畫來改變線圈的當前屬性值.Left,Top,Width和Height與預期的一樣。

但是,我想要完成的是對線圈屬性值的任何更改都是動畫更改。所以我的計劃是設置一個DataTrigger並使用一個轉換器始終返回true,以便任何更改都會導致通過動畫播放更改。

但是不管我做什麼,在使用DataTrigger時我甚至在打開窗口之前收到異常錯誤,但我不知道爲什麼會發生這種情況。爲了保持它的簡單,我拿出轉換器,只是使用的直值:

<Rectangle Fill="{x:Static SystemColors.ControlBrush}" 
     Stroke="black"> 
<Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Canvas.Left" Value="{Binding Path=Coil.Left, Mode=OneTime}"/> 
     <Setter Property="Canvas.Top" Value="{Binding Path=Coil.Top, Mode=OneTime}"/> 
     <Setter Property="Width" Value="{Binding Path=Coil.Width, Mode=OneTime}"/> 
     <Setter Property="Height" Value="{Binding Path=Coil.Height, Mode=OneTime}"/> 
    </Style> 
</Rectangle.Style> 
<Rectangle.Triggers> 
    <DataTrigger Binding="{Binding Path=Coil.Height}" Value="60"> 
     <DataTrigger.EnterActions> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetProperty="Width" 
             To="{Binding Path=Coil.Width, Mode=OneWay}" 
             Duration="0:0:5"/> 
        <DoubleAnimation Storyboard.TargetProperty="Height" 
             To="{Binding Path=Coil.Height, Mode=OneWay}" 
             Duration="0:0:0.5"/> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" 
             To="{Binding Path=Coil.Left, Mode=OneWay}" 
             Duration="0:0:5"/> 
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" 
             To="{Binding Path=Coil.Top, Mode=OneWay}" 
             Duration="0:0:5"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
    </DataTrigger> 
</Rectangle.Triggers> 

爲什麼這會給我一個異常錯誤有什麼想法?我相信這只是我對WPF缺乏經驗的問題。這是我的第一個項目。

預先感謝您。

--John

+0

你有什麼異常? – evanb

+0

異常類型爲System.Windows.Markup.XamlParseException 異常爲:''System.Windows.Shapes.Rectangle'初始化引發異常 存在{「Triggers集合成員必須是類型的內部異常EventTrigger。「} – ajw1970

+0

也許我可以用一個DataTemplate做些事情,這個DataTemplate看起來支持DataTriggers ...在閱讀中我還沒有得到那麼多。 – ajw1970

回答

0

對於FrameworkElementRectangle你只能使用EventTrigger。在Style,ControlTemplateDataTemplate中,您也可以使用Trigger/MultiTriggerDataTrigger/MultiDataTrigger

這意味着將您DataTriggerRectangle風格,它應該工作:

<Rectangle Fill="{x:Static SystemColors.ControlBrush}" Stroke="Black"> 
    <Rectangle.Style> 
     <Style TargetType="{x:Type Rectangle}"> 
      ... 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Coil.Height}" Value="60"> 
        ... 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Rectangle.Style> 
</Rectangle> 
+0

謝謝,但我曾嘗試過,並以這種方式得到了異常錯誤: {「'設置屬性'System.Windows.FrameworkElement.Style'拋出一個異常。'行號'120'和行位置'22'。「} {」無法凍結此Storyboard時間軸樹以供跨線程使用「。} – ajw1970

+0

這是SO上的新問題的另一個問題。 – LPL

+0

好的,謝謝,我會在重新發布前做更多的測試。 – ajw1970

0

最近讀到這一點。儘管EventTriggersDataTriggers的相似性,您可以在Storyboard內使用Binding而不是EventTrigger,而不是DataTrigger

所以你會得到一個System.Windows.Markup。XamlParseException錯誤,如果你嘗試使用的回報Storyboard條件內結合,如下面,

<Style.Triggers> 
    <DataTrigger Binding="{Binding Path=IsBarVisible, 
    Converter={StaticResource myBooleanToVisibiltyConverter}}" Value="Visible"> 
    <DataTrigger.EnterActions> 
     <BeginStoryboard> 
     <Storyboard> 
      <DoubleAnimation 
      Storyboard.TargetProperty="Value" 
      From="{Binding Path=ProgressedAmout}" 
      To="100" 
      Duration="0:0:50" 
      ></DoubleAnimation> 
     </Storyboard> 
     </BeginStoryboard> 
    </DataTrigger.EnterActions> 
    </DataTrigger> 
</Style.Triggers> 

您可以使用和EventTrigger或擺脫StoryboradToFrom結合。