2009-11-05 30 views
14

नोट मैं (एक स्वीकृत जवाब के साथ) संबंधित सवाल पूछा है: How to combine DataTrigger and Trigger?डेटा ट्रिगर और इवेंट ट्रिगर को कैसे गठबंधन करें?

मुझे लगता है कि मैं एक EventTrigger गठबंधन करने के लिए की जरूरत है और एक DataTrigger प्राप्त करने के लिए मैं क्या कर रहा हूँ के बाद:

  • जब मेरी सूची बॉक्स में कोई आइटम दिखाई देता है, तो उसे कुछ क्षणों के लिए फ्लैश करना चाहिए
  • यदि आइटम 'गंभीर' है तो इसे
  • पर हाइलाइट किया जाना चाहिए

वर्तमान में मैं एक DataTemplate है कि इस तरह दिखता है:

<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> 

विचार है कि एक EventTrigger 0 और 1 के बीच Highlight सीमा की अस्पष्टता एनिमेट होने और फिर से वापस बार बार जब आइटम पहले भरी हुई है, ड्राइंग है उपयोगकर्ता का ध्यान DataTrigger एनिमेट करने के लिए समय की संख्या निर्धारित करता है। यदि दृश्य मॉडल रिपोर्ट करता है कि आइटम IsCritical है तो एनीमेशन 5.5 गुना होता है (जैसे कि यह अस्पष्टता 1 पर समाप्त होता है), अन्यथा यह 5 गुना (अस्पष्टता 0 पर समाप्त होता है)

हालांकि उपर्युक्त XAML काम नहीं करता है डेटा ट्रिगर का सेटर विफल रहता है:

विज़ुअलट्री में नाम 'लोडेडएनीमेशन' नाम वाला बच्चा नहीं मिला।

पर्याप्त मेला। तो, एक कस्टम मान कनवर्टर का उपयोग करने या दृश्य मॉडल पर एनीमेशन गिनती डालने और इसके लिए बाध्यकारी, मेरे विकल्प क्या हैं? इस तरह

+0

यह सहायक हो सकता है http://stackoverflow.com/questions/2764415/how-to-give-the-condition-for-eventtrigger –

उत्तर

-3

कोशिश कुछ:

<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

क्या आपने यह कोशिश की है? यह मेरा अनुभव है कि आपके पास ऐसी शैली नहीं हो सकती है जो शैली सेट करे। –

+1

आप शैली के अंदर शैली सेट नहीं कर सकते हैं –

0

आप ब्लेंड एसडीके (क्या आप चाहिए उपयोग कर रहे हैं VS2012 +) के लिए उपयोग किया है, तो आप XAML में पूरी तरह से यह पूरा करने में सक्षम, कुछ इस तरह से किया जाना चाहिए (अस्वीकरण: अपरीक्षित):

<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> 

एक VisualState करने के लिए अपने स्टोरीबोर्ड निकालें, तो XAML भीतर राज्यों स्विच करने के लिए अभिव्यक्ति पुस्तकालय का उपयोग करें। आपको Microsoft.Expression.Interactions लाइब्रेरी की आवश्यकता होगी, WPF/Silverlight States - Activate from XAML?

0

मैं इस मामले में ट्रिगर्स की बजाय व्यवहार का उपयोग करूंगा। आप एक ऐसा व्यवहार लिख सकते हैं जो किसी ईवेंट हैंडलर को संबंधित ऑब्जेक्ट के लोड ईवेंट से जोड़ता है और फिर एनीमेशन लागू करता है। व्यवहार कुछ गुणों का पर्दाफाश कर सकता है, मैं एक एनीमेशन काउंटर (int) प्रॉपर्टी का पर्दाफाश करता हूं जो व्यवहार को बताता है कि उस तत्व पर एनीमेशन को दोहराने के लिए कितना समय है। इसके बाद आप दृश्य मॉडल में IsCritical संपत्ति को इस संपत्ति को बाध्य करने और एक मूल्य कनवर्टर का उपयोग 5 और सच करने के लिए झूठी कन्वर्ट करने के लिए 5.5

आशा कर सकते हैं इस में मदद करता है

0

मैं जानता हूँ कि आप ने कहा आप के लिए उत्सुक नहीं थे कनवर्टर का विचार, लेकिन ऐसा लगता है कि ब्लेंड समाधानों को लाइब्रेरी स्थापित करने की आवश्यकता होती है।कनवर्टर ज्यादा काम और संकेत मंशा नहीं है कि दर सीधे IsCritical संपत्ति पर निर्भर है:

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

और फिर अपने एनीमेशन अद्यतन:

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

DataTrigger तो हटाया जा सकता है।

संबंधित मुद्दे