2009-08-06 21 views
7

मुझे यह पता लगाना सबसे कठिन समय है: कहें कि मेरे पास दो बटन और तीन टेक्स्टब्लॉक हैं। मैं या तो बटन को सभी टेक्स्टब्लॉक पर एक साधारण स्टोरीबोर्ड ट्रिगर करना चाहता हूं। वर्तमान में मैं एक सामान्य टेक्स्टब्लॉक शैली को परिभाषित करने की कोशिश कर रहा हूं जिसमें स्टोरीबोर्ड है, और फिर ट्रिगर किसी भी बटन क्लिक से आता है। यह निकटतम मैं आ गए है, लेकिन स्टार्टअप पर ऐप्स दुर्घटनाओं ... मैं क्या हूँ यहाँ गलत नहीं है:डब्ल्यूपीएफ - इसे बनाने से मुझे आसान होना चाहिए

<Window.Resources> 

<Style TargetType="TextBlock" > 
    <Setter Property="Foreground" Value="Blue" /> 
    <Style.Resources> 
     <Storyboard x:Key="TextBlockOpacity" Storyboard.TargetProperty="Opacity"> 
      <DoubleAnimation From="0" To="1" /> 
     </Storyboard> 
    </Style.Resources>  
</Style> 

<Window.Triggers> 
    <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="button"> 
     <BeginStoryboard Storyboard="{StaticResource TextBlockOpacity}"/> 
    </EventTrigger> 
</Window.Triggers> 


<Grid x:Name="LayoutRoot"> 
    <Button x:Name="button" HorizontalAlignment="Left" Margin="51,54,0,0" VerticalAlignment="Top" Width="96" Height="45" Content="Button"/> 

    <TextBlock x:Name="textBlock1" Margin="228,54,172,0" VerticalAlignment="Top" Height="45" FontSize="26.667" Text="TextBlock" TextWrapping="Wrap" /> 
    <TextBlock x:Name="textBlock2" Margin="228,103,172,0" VerticalAlignment="Top" Height="45" FontSize="26.667" Text="Hello" TextWrapping="Wrap"/> 
</Grid> 
+3

मैं अपने दर्द महसूस –

+0

आप अगर में कोड-पीछे आप ठीक ढंग से शुरू कर सकते हैं देख रहा स्टोरीबोर्ड कोई नाम देने की कोशिश कर सकते हैं, और उसके बाद()।।। यह? –

+0

क्या आप यहां एक ही प्रश्न पूछ रहे हैं: http://stackoverflow.com/questions/1238817/wpf-animation-question या आप 2 बटन क्लिक ट्रिगर्स की तलाश में हैं? – SergioL

उत्तर

4

केक 444 के एक्समल-केवल समाधान के आधार पर, मैं थोड़ा बेहतर संस्करण प्रस्तुत करता हूं जो बटन के डेटाकॉन्टेक्स्ट पर भरोसा नहीं करता है और इसमें कई ट्रिगर्स हो सकते हैं।

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="WpfApplication1.MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" Height="480"> 
    <Window.Resources> 
     <UIElement x:Key="OpacityCounter" Opacity="0"/> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Opacity" Value="{Binding Source={StaticResource OpacityCounter}, Path=Opacity}" /> 
     </Style> 
     <Storyboard x:Key="OnClick1"> 
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.Target="{StaticResource OpacityCounter}" Storyboard.TargetProperty="(UIElement.Opacity)"> 
       <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
       <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
    </Window.Resources> 
    <Window.Triggers> 
     <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="button1"> 
      <BeginStoryboard Storyboard="{StaticResource OnClick1}"/> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="button2"> 
      <BeginStoryboard Storyboard="{StaticResource OnClick1}"/> 
     </EventTrigger> 
    </Window.Triggers> 

    <Grid x:Name="LayoutRoot"> 
     <StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <Button x:Name="button1" Width="131" Height="37" Content="Button 1" Margin="0,0,0,22"/> 
       <Button x:Name="button2" Width="131" Height="37" Content="Button 2" Margin="0,0,0,22"/> 
      </StackPanel> 
      <TextBlock x:Name="textBlock" Height="27" Text="TextBlock 1" TextWrapping="Wrap" /> 
      <TextBlock x:Name="textBlock1" Height="27" Text="TextBlock 2" TextWrapping="Wrap" /> 
      <TextBlock x:Name="textBlock2" Height="27" Text="TextBlock 3" TextWrapping="Wrap" /> 
      <TextBlock x:Name="textBlock3" Height="27" Text="TextBlock 4" TextWrapping="Wrap" /> 
     </StackPanel> 
    </Grid> 
</Window> 

(बशर्ते आप "ListBox1" किसी ऐसे स्थान पर नामित एक ListBox एक ट्रिगर तंत्र के रूप में एक ListBox का उपयोग करने के लिए, Window.Triggers को निम्नलिखित जोड़ें:

<EventTrigger RoutedEvent="Selector.SelectionChanged" SourceName="listbox1"> 
    <BeginStoryboard Storyboard="{StaticResource OnClick1}"/> 
</EventTrigger> 

या एक विशिष्ट ListBoxItem बंद को गति प्रदान करने, आप की आवश्यकता होगी (जहां ITEM1 एक नाम है ListBoxItem):

<EventTrigger RoutedEvent="ListBoxItem.Selected" SourceName="item1"> 
    <BeginStoryboard Storyboard="{StaticResource OnClick1}"/> 
</EventTrigger> 
+0

यह बहुत अच्छा है! मैं संसाधनों के रूप में UIElements बनाने से बचना चाहता था, लेकिन लोगों को उनके साथ बेहतर तरीके से जाना चाहिए। हालांकि, इस दृष्टिकोण को इस तथ्य के आधार पर सुधार किया गया है कि यह डेटाकॉन्टेक्स्ट का उपयोग नहीं करता है और एकाधिक ट्रिगर्स का समर्थन करता है कुछ हद तक अनुचित होगा। DataContext पर संसाधन UIElement का उपयोग करना व्यक्तिगत वरीयता का मामला है; और दोनों समाधान कई ट्रिगर्स का समर्थन करते हैं। अन्यथा, अच्छा काम। ;) –

+0

ठीक है ... अब इसे थोड़ा और जटिल बनाने के लिए ... मैं वास्तव में एक बटन से ट्रिगर करने की कोशिश नहीं कर रहा हूं, लेकिन एक सूची बॉक्स से बाहर एक सूची बॉक्स से बदलता है जो एक सीमा के अंदर, एक सीमा के अंदर है, अंदर मुख्य खिड़की में एक ग्रिड। मैं इसे घंटों तक करने की कोशिश कर रहा हूं लेकिन सही रूटआउट नहीं प्राप्त कर सकता ... सभी ListBoxItem ईवेंट कक्षा के मुहरबंद या कुछ के बारे में एक त्रुटि देते हैं ... – LSTayon

+0

मैंने केवल इसे बेहतर कहा क्योंकि इसे प्रत्येक के लिए एक अलग डेटाकॉन्टेक्स्ट की आवश्यकता नहीं है ट्रिगर तंत्र (यानी बटन)। मैं अपमान करने का मतलब नहीं था। – SergioL

6

आप को बदलने के लिए बटन "समर्पित" अगर अस्पष्टता, आप इसके DataContext का उपयोग कर सकते हैं और इसे एनिमेट कर सकते हैं। इसके बाद अपने तत्वों 'OpacityDataContext करने के लिए बाध्य:

<Window x:Class="SomeNamespace.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources>   
     <Storyboard x:Key="TextBlockOpacity" Storyboard.TargetName="button1" Storyboard.TargetProperty="DataContext" > 
      <DoubleAnimation From="0.1" To="1"/> 
     </Storyboard>   
     <Style TargetType="TextBlock" > 
      <Setter Property="Foreground" Value="Blue" /> 
      <Setter Property="Background" Value="LightGray" /> 
      <Setter Property="FontSize" Value="26.667" /> 
      <Setter Property="TextWrapping" Value="Wrap" /> 
      <Setter Property="Height" Value="45" />    
      <Setter Property="Opacity" Value="{Binding ElementName=button1, Path=DataContext}"/> 
     </Style> 
    </Window.Resources> 

    <Window.Triggers> 
     <EventTrigger RoutedEvent="ButtonBase.Click"> 
      <BeginStoryboard Storyboard="{StaticResource TextBlockOpacity}" > 
      </BeginStoryboard> 
     </EventTrigger> 

     <EventTrigger RoutedEvent="ListBox.SelectionChanged"> 
      <BeginStoryboard Storyboard="{StaticResource TextBlockOpacity}" > 
      </BeginStoryboard> 
     </EventTrigger> 
    </Window.Triggers> 

    <Grid x:Name="LayoutRoot"> 
     <Button x:Name="button1" HorizontalAlignment="Left" Margin="51,54,0,0" VerticalAlignment="Top" Width="96" Height="45" Content="Button"> 
      <Button.DataContext> 
       <System:Double>0</System:Double> 
      </Button.DataContext> 
     </Button> 

     <Button x:Name="button2" HorizontalAlignment="Right" Margin="0,54,29,0" VerticalAlignment="Top" Width="96" Height="45" Content="Button"/> 

     <ListBox x:Name="listBox1" Height="50" VerticalAlignment="Top"> 
      <ListBox.Items> 
       <System:String>Text1</System:String> 
       <System:String>Text2</System:String> 
      </ListBox.Items> 
     </ListBox> 

     <TextBlock x:Name="textBlock1" Margin="51,114,61,0" Text="TextBlock" Height="45" VerticalAlignment="Top" Width="166" /> 
     <TextBlock x:Name="textBlock2" Margin="51,0,74,42" Text="Hello" Height="45" Width="153" VerticalAlignment="Bottom" /> 
    </Grid> 
</Window> 

(मैं भी अपने XAML थोड़ा पुनर्संशोधित है) इसके अलावा एक बात ध्यान दें - इस दृष्टिकोण अगर आप अपने कम करना चाहते हैं उपयोग करने के लिए है कोड, और यह सब xaml में होता है। आपका दृष्टिकोण पूरी विंडो के Opacity को समेटेगा। यही कारण है कि उपर्युक्त कोड में, टेक्स्टब्लॉक बटन के DataContext से जुड़ता है, जो स्वयं एनिमेटेड है।

यह सामान्य मूल्य (डेटाकॉन्टेक्स्ट) के बाध्यकारी के बिना निश्चित रूप से करने योग्य है, लेकिन फिर आपको एक्स एनिमेशन दोहराने की आवश्यकता है (क्योंकि आपको X TargetNames सेट करने की आवश्यकता है)। ऊपर यह दृष्टिकोण अधिक आसानी से विस्तार योग्य और रखरखाव योग्य है।

संपादित

जोड़ा गया एक और बटन और विविधता :)

0

अपने नमूना में, आप एक संसाधन के रूप में एक शैली के अंदर स्टोरीबोर्ड परिभाषित कर रहे हैं, लेकिन फिर आप के रूप में यह उपयोग करने के लिए कोशिश कर रहे हैं के लिए एक ListBox एक विंडो संसाधन। स्टोरीबोर्ड घोषणा को विंडो में ले जाने का प्रयास करें। स्रोत, फिर शैली में स्टोरीबोर्ड का संदर्भ लें।

मुझे यह पता नहीं है कि यह वही करेगा जो आप चाहते हैं, लेकिन मैं वहां से शुरू करूंगा।

+0

ठीक है, मैं इसके लिए हमेशा के लिए दौड़ रहा हूं, लेकिन यह नामस्कोप के लिए क्या उबलता है।मेरे पास एक सूची बॉक्स है जिसे मैं टेक्स्टब्लॉक पर एनीमेशन ट्रिगर करना चाहता हूं, लेकिन वे समान नामस्कोप में नहीं हैं, इसलिए यदि मैंने स्टोरीबोर्ड को विंडोज़ में रखा है। स्रोत, तो लिस्टबॉक्स ट्रिगर स्टोरीबार्ड ढूंढ सकता है लेकिन स्टोरीबार्ड को नहीं मिल रहा है टेक्स्टब्लॉक का लक्ष्यनाम। यदि मैंने स्टोरीबोर्ड को ग्रिड में रखा है। संसाधन (जहां टेक्स्टब्लॉक हैं) तो ListBox चेंज ट्रिगर स्टोरीबोर्ड नहीं ढूंढ सकता है। क्या नामकरण सम्मेलन को पार करने के लिए मैं कुछ नामकरण सम्मेलन का उपयोग कर सकता हूं? उह! धन्यवाद! – LSTayon