2009-11-05 24 views
14

LƯU Ý Tôi đã hỏi những câu hỏi liên quan (với một câu trả lời được chấp nhận): How to combine DataTrigger and Trigger?Làm thế nào để kết hợp DataTrigger và EventTrigger?

Tôi nghĩ tôi cần phải kết hợp một EventTriggerDataTrigger để đạt được những gì tôi sau:

  • khi một mục xuất hiện trong ListBox của tôi, nó sẽ nhấp nháy trong một vài khoảnh khắc
  • nếu mặt hàng là 'Quan trọng' thì nó sẽ vẫn được đánh dấu

Hiện nay tôi có một DataTemplate trông như thế này:

<DataTemplate DataType="{x:Type Notifications:NotificationViewModel}"> 
    <Grid HorizontalAlignment="Stretch"> 
     <Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
     <Border Name="Highlight" CornerRadius="8" Background="Red"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
     <!-- snip actual visual stuff --> 
     <Grid.Triggers> 
      <EventTrigger RoutedEvent="Grid.Loaded"> 
       <EventTrigger.Actions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation x:Name="LoadedAnimation" 
              Storyboard.TargetName="Highlight" 
              Storyboard.TargetProperty="Opacity" 
              From="0" To="1" 
              RepeatBehavior="5x" 
              Duration="0:00:0.2" 
              AutoReverse="True" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger.Actions> 
      </EventTrigger> 
     </Grid.Triggers> 
    </Grid> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=IsCritical}" Value="True"> 
      <Setter TargetName="LoadedAnimation" Property="RepeatBehavior" Value="5.5x" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

Ý tưởng là một EventTrigger sinh động opacity Highlight biên giới của giữa 0 và 1 và ngược lại nhiều lần khi mục được nạp đầu tiên, vẽ sự chú ý của người dùng đối với nó. DataTrigger xác định số lần hoạt ảnh. Nếu mô hình xem báo cáo rằng mục IsCritical thì hoạt ảnh xảy ra 5,5 lần (sao cho nó kết thúc ở độ mờ 1), nếu không nó xảy ra 5 lần (kết thúc ở độ mờ đục 0.)

Tuy nhiên, XAML trên không hoạt động vì thiết lập của DataTrigger không thành công với:

Trẻ em có tên 'LoadedAnimation' không được tìm thấy trong VisualTree.

Đủ công bằng. Vì vậy, nhút nhát khi sử dụng trình chuyển đổi giá trị tùy chỉnh hoặc đặt số lượng hoạt ảnh trên mô hình chế độ xem và liên kết với nó, các tùy chọn của tôi là gì?

+0

Có thể hữu ích http://stackoverflow.com/questions/2764415/how-to-give-the-condition-for-eventtrigger –

Trả lời

-3

Hãy thử một cái gì đó như thế này:

<Style x:Key="EventTriggerStyleKey"> 
    <Style.Triggers> 
    <EventTrigger RoutedEvent="some event here"> 
     <!-- your animation here --> 
    </EventTrigger> 
    <Style.Triggers> 
</Style> 

<Style x:Key="myStyleKey"> 
    <Style.Triggers> 
    <DataTrigger Binding="....." Value="......"> 
     <Setter Property="........." Value="......."/> 
     <Setter Property="Style" Value="{StaticResource EventTriggerStyleKey}"/> 
    </DataTrigger> 
    <Style.Triggers> 
</Style> 
+4

Bạn đã thử cách này chưa? Đó là kinh nghiệm của tôi rằng bạn không thể có một phong cách thiết lập một phong cách. –

+1

Bạn không thể đặt kiểu bên trong một kiểu –

0

Nếu bạn có quyền truy cập vào SDK Blend (bạn nên nếu bạn đang sử dụng VS2012 +), bạn sẽ có thể thực hiện điều này hoàn toàn bằng XAML, với một cái gì đó như thế này (tuyên bố từ chối trách nhiệm: chưa được kiểm tra):

<Grid HorizontalAlignment="Stretch"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="NotificationStates"> 
      <VisualState x:Name="Flashing"> 
       <Storyboard> 
        <DoubleAnimation x:Name="LoadedAnimation" 
            Storyboard.TargetName="Highlight" 
            Storyboard.TargetProperty="Opacity" 
            From="0" To="1" 
            RepeatBehavior="5x" 
            Duration="0:00:0.2" 
            AutoReverse="True" /> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="Normal" /> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
    <Border Name="Highlight" CornerRadius="8" Background="Red"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
    <!-- snip actual visual stuff --> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <ic:GoToStateAction StateName="Flashing"/> 
     </i:EventTrigger> 
     <ie:DataTrigger Binding="{Binding Path=IsCritical}" Value="True"> 
      <ic:GoToStateAction StateName="Flashing"/> 
     </ie:DataTrigger> 
    </i:Interaction.Triggers> 
</Grid> 

Trích xuất Storyboard của bạn thành VisualState, sau đó sử dụng thư viện biểu thức để chuyển trạng thái trong XAML. Bạn sẽ cần thư viện Microsoft.Expression.Interactions, xem thêm WPF/Silverlight States - Activate from XAML?

0

Tôi sẽ sử dụng hành vi thay vì trình kích hoạt trong trường hợp này. Bạn có thể viết một hành vi gắn một trình xử lý sự kiện vào sự kiện tải của đối tượng được liên kết và sau đó áp dụng hoạt ảnh. Các hành vi có thể phơi bày một số tài sản, tôi sẽ phơi bày một AnimationCount (int) bất động sản mà nói với hành vi bao nhiêu thời gian để lặp lại các hình ảnh động trên các yếu tố mà nó được liên kết với. Sau đó bạn có thể liên kết thuộc tính này sang bất động sản IsCritical trong mô hình xem và sử dụng một bộ chuyển đổi giá trị để chuyển đổi sai đến 5 và đúng đến 5,5

Hope this helps

0

Tôi biết anh nói anh không quan tâm đến các ý tưởng của một công cụ chuyển đổi, nhưng có vẻ như các giải pháp Blend yêu cầu phải cài đặt một thư viện.Bộ chuyển đổi không phải là nhiều việc và tín hiệu ý định rằng tỷ lệ phụ thuộc trực tiếp vào IsCritical tài sản:

public class CriticalAnimationRateConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // Error handling omitted for brevity. 
     if ((bool)value) 
      return new System.Windows.Media.Animation.RepeatBehavior(5.5); 
     else 
      return new System.Windows.Media.Animation.RepeatBehavior(5.0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Và sau đó cập nhật hình ảnh động của bạn:

<DoubleAnimation Storyboard.TargetName="Highlight" 
       Storyboard.TargetProperty="Opacity" 
       From="0" 
       To="1" 
       RepeatBehavior="{Binding IsCritical, Converter={StaticResource CriticalAnimationRateConverter}}" 
       Duration="0:00:0.2" 
       AutoReverse="True" /> 

các DataTrigger sau đó có thể được gỡ bỏ.

Các vấn đề liên quan