2011-04-14 10 views
5

मुझे रंग एनीमेशन के साथ समस्या है।कंट्रोल टेम्पलेट स्टोरीबोर्ड रंग एनीमेशन समस्या

<Window.Resources> 
    <hedit:BrushToColorConverter x:Key="BrushToColorConverter" /> 
    <Style x:Key="MyButtonStyle" TargetType="Button"> 
     <Setter Property="OverridesDefaultStyle" Value="True"/> 
     <Setter Property="Margin" Value="5"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <ControlTemplate.Resources> 
         <Storyboard x:Key="buttonAnimIn"> 
          <!-- Problem line --> 
          <ColorAnimation Storyboard.TargetName="bntBack" Storyboard.TargetProperty="Color" To="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Converter={StaticResource BrushToColorConverter}}" /> 
         </Storyboard> 
         <Storyboard x:Key="buttonAnimOut"> 
          <ColorAnimation Storyboard.TargetName="bntBack" Storyboard.TargetProperty="Color" To="Blue" /> 
         </Storyboard> 
         <Storyboard x:Key="buttonAnimForegroundIn"> 
          <ColorAnimation Storyboard.TargetName="btnFore" Storyboard.TargetProperty="Color" To="Blue" /> 
         </Storyboard> 
         <Storyboard x:Key="buttonAnimForegroundOut"> 
          <ColorAnimation Storyboard.TargetName="btnFore" Storyboard.TargetProperty="Color" To="Red" /> 
         </Storyboard> 
        </ControlTemplate.Resources> 
        <Border Name="border" 
         BorderThickness="1" 
         Padding="4,2" 
         BorderBrush="DarkGray" 
         CornerRadius="3"> 
         <Border.Background> 
          <SolidColorBrush Color="Blue" x:Name="bntBack" /> 
         </Border.Background> 
         <ContentControl HorizontalAlignment="Center" VerticalAlignment="Center" Content="{TemplateBinding Content}"> 
          <ContentControl.Foreground> 
           <SolidColorBrush Color="Red" x:Name="btnFore" /> 
          </ContentControl.Foreground> 
         </ContentControl > 
        </Border> 
        <ControlTemplate.Triggers> 
         <EventTrigger RoutedEvent="Button.MouseEnter"> 
          <BeginStoryboard Storyboard="{StaticResource buttonAnimIn}" /> 
          <BeginStoryboard Storyboard="{StaticResource buttonAnimForegroundIn}" /> 
         </EventTrigger> 
         <EventTrigger RoutedEvent="Button.MouseLeave"> 
          <BeginStoryboard Storyboard="{StaticResource buttonAnimOut}" /> 
          <BeginStoryboard Storyboard="{StaticResource buttonAnimForegroundOut}" /> 
         </EventTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

समस्या है::

प्रकार की वस्तु 'System.Windows.Style' के लिए विशेषता 'शैली' में मान कनवर्ट नहीं कर सकता यह मेरा स्रोत है। धागे के उपयोग के लिए इस स्टोरीबोर्ड टाइमलाइन पेड़ को फ्रीज नहीं कर सकता। मार्कअप फ़ाइल 'HLSLEditor; घटक/mainwindow.xaml' लाइन 223 स्थिति 25.

निश्चित रंगों का उपयोग करते समय यह काम करता है, लेकिन यह फोरग्राउंड रंग के साथ काम नहीं कर सकता है, पर ऑब्जेक्ट 'System.Windows.Controls.Button' में त्रुटि। अभिभावक ...

मैं अग्रभूमि या पृष्ठभूमि रंग के लिए एक एनीमेशन कैसे करूं?

धन्यवाद!

+0

वैसे, स्टोरीबोर्ड उन की बात समूह एनिमेशन के लिए है, तो आप सामान्य रूप से केवल एक 'InStoryboard' और' OutStoryboard', जहां प्रत्येक दो एनिमेशन शामिल होगा। –

उत्तर

6

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

उदा।

<Window.Background> 
    <SolidColorBrush Color="{DynamicResource Background}"/> 
</Window.Background> 
<Window.Resources> 
    <Color x:Key="Background">Green</Color> 
</Window.Resources> 
<ColorAnimation Storyboard.TargetProperty="Foreground.Color" 
       Duration="0:0:1" 
       To="{StaticResource Background}"/> 

एक संसाधन वर्ग का उपयोग कर वैकल्पिक:

public static class MyColors 
{ 
    public static Color MyHighlightColor = Color.FromArgb(255, 0, 88, 0); 
} 
<ColorAnimation Storyboard.TargetProperty="Foreground.Color" 
       Duration="0:0:1" 
       To="{x:Static local:MyColors.MyHighlightColor}"/> 
+0

इस सुझाव के लिए धन्यवाद एचबी। हालांकि समस्या यह है कि मेरे सभी रंग संसाधन फ़ाइल में हैं, हमने ऐप में स्किनिंग की है। क्या इस पर जाने का कोई तरीका है जिसमें xaml फ़ाइल में घोषित स्थिर रंग शामिल नहीं हैं? –

+0

किस प्रकार की संसाधन फ़ाइल? यदि यह रंगों को स्थिर सार्वजनिक फ़ील्ड के रूप में घोषित करता है तो आप स्थिर संसाधनों का उपयोग करने के बजाय '{x: स्टेटिक नेमस्पेस: क्लास। फ़ील्ड} 'का उपयोग कर सकते हैं। ([X: स्टेटिक संदर्भ] (http://msdn.microsoft.com/en-us/library/ms742135.aspx)) –

+0

जोड़ा जवाब देने के लिए है। –

2

मुझे लगता है कि त्रुटि को समझने आप समस्या को ठीक करने का एक तरीका दे सकता है।

एनीमेशन के लिए यूआई थ्रेड के अलावा धागे के उपयोग की आवश्यकता है। तो स्टोरीबोर्ड को फ्रीज करने योग्य होना चाहिए, जिसका अर्थ है कि स्टोरीबोर्ड में सभी एनीमेशन फ्रीजबल होना चाहिए, और उन सभी एनिमेशन का उपयोग भी फ्रीजबल होना चाहिए।

बाइंडिंग फ्रीज नहीं हैं - परिभाषा के अनुसार बहुत अधिक, क्योंकि वे एक तंत्र हैं जिससे एक निर्भरता संपत्ति बदला जा सकता है। आप एक रंग एनीमेशन में गतिशील बाध्यकारी का उपयोग नहीं कर सकते हैं - एनीमेशन चल रहा था, जबकि संपत्ति बदल सकती है संभावना है। वही बात होती है कि आप किसी ऑब्जेक्ट पर बाध्यकारी हैं या आप DynamicResource का उपयोग कर रहे हैं।

बात यह है कि यह आपको ऐसी चीज़ से बचा रहा है जिसे आप वास्तव में नहीं चाहते हैं। एनीमेशन चल रहा है, जबकि आप वास्तव में रंग बदलना नहीं चाहते हैं। यही वह नहीं है जिसे आप पूरा करने की कोशिश कर रहे हैं। आप रंग संसाधन चाहते हैं कि एनीमेशन बदलने के लिए उपयोग कर रहा है यदि उपयोगकर्ता एक अलग त्वचा का चयन करता है।

तो स्किन्डर करने योग्य संसाधनों के लिए स्टोरीबोर्ड को बाध्य करने के बजाय, स्टोरीबोर्ड को उन संसाधनों के शब्दकोश में जोड़ें जो त्वचा में परिवर्तन करते समय सेट हो जाते हैं (रंग सेट करने के लिए स्थिर बाइंडिंग का उपयोग करके), और अपने ईवेंट ट्रिगर में गतिशील बाध्यकारी का उपयोग करें। यह काम करना चाहिए।

+0

आपके विचार के लिए धन्यवाद, कि दुर्भाग्य से मैं क्या आपकी पुष्टि के साथ कुछ शोध के बाद सोचा था, अब है।/ –

+0

मुझे लगता है कि मैं क्या सुझाव दिया बस XAML चलती, नहीं कोड और इसकी जगह शामिल है: XAML बाहर, में .cs एकमात्र समाधान है। मुझे निश्चित रूप से कहने के लिए आपके आवेदन के बारे में पर्याप्त जानकारी नहीं है। –

1

जब मैं इस समस्या से आया तो मैंने अपनी शैली को संशोधित करके एक दूसरे के शीर्ष पर दो समान तत्वों को रखने के लिए काम किया - एक 'सामान्य' राज्य के लिए और एक 'दबाए गए' राज्य के लिए। 'दबाए गए' में Opacity डिफ़ॉल्ट रूप से 0 पर सेट किया गया था और दूसरे के पास Opacity था। मेरी एनीमेशन ने 0 से 1 तक और इसके विपरीत क्षमताओं को बदल दिया।

यह दृष्टिकोण वास्तव में Color संपत्ति एनिमेट बचा लेकिन XAML में सब कुछ रखने, जबकि एक ही प्रभाव का उत्पादन किया। चूंकि रंग एनीमेशन की बजाय स्टाइल परिभाषा में सेट किए गए थे, इसलिए उन्हें आवश्यकतानुसार बाध्य किया जा सकता था। यह शायद सभी परिस्थितियों के लिए उपयुक्त नहीं होगा लेकिन मेरी काफी सरल शैली के लिए यह वांछित प्रभाव प्राप्त करने का एक बहुत तेज़ तरीका था।

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