2009-03-30 9 views
35

मैं अपने एप्लिकेशन के "ऐप" क्षेत्र में एक नए नियंत्रण में फीका करने की कोशिश कर रहा हूं जो मौजूदा नियंत्रण हटा दिए जाने के बाद प्रोग्रामेटिक रूप से जोड़ा जाता है। मेरे कोड इस तरह दिखता है:प्रोग्रामेटिक रूप से जोड़े गए नियंत्रण पर स्टोरीबोर्ड एनीमेशन का उपयोग

 void settingsButton_Clicked(object sender, EventArgs e) 
    { 
     ContentCanvas.Children.Clear(); 

     // Fade in settings panel 
     NameScope.SetNameScope(this, new NameScope()); 

     SettingsPane s = new SettingsPane(); 
     s.Name = "settingsPane"; 

     this.RegisterName(s.Name, s); 
     this.Resources.Add(s.Name, s); 

     Storyboard sb = new Storyboard(); 

     DoubleAnimation settingsFade = new DoubleAnimation(); 
     settingsFade.From = 0; 
     settingsFade.To = 1; 
     settingsFade.Duration = new Duration(TimeSpan.FromSeconds(0.33)); 
     settingsFade.RepeatBehavior = new RepeatBehavior(1); 
     Storyboard.SetTargetName(settingsFade, s.Name); 
     Storyboard.SetTargetProperty(settingsFade, new PropertyPath(UserControl.OpacityProperty)); 

     ContentCanvas.Children.Add(s); 

     sb.Children.Add(settingsFade); 
     sb.Begin(); 
    } 

हालांकि, जब मैं इस कोड चलाने के लिए, मैं त्रुटि मिलती है "नहीं लागू नाम गुंजाइश नाम 'settingsPane' को हल करने से मौजूद है।"

मैं संभवतः गलत क्या कर रहा हूं? मैं बहुत यकीन है कि मैं ठीक से सब कुछ :(

उत्तर

57

मैं NameScopes आदि के साथ परेशानी नहीं होता पंजीकृत कर लिया है और नहीं बल्कि बजाय Storyboard.SetTarget का प्रयोग करेंगे हूँ।

var b = new Button() { Content = "abcd" }; 
stack.Children.Add(b); 

var fade = new DoubleAnimation() 
{ 
    From = 0, 
    To = 1, 
    Duration = TimeSpan.FromSeconds(5), 
}; 

Storyboard.SetTarget(fade, b); 
Storyboard.SetTargetProperty(fade, new PropertyPath(Button.OpacityProperty)); 

var sb = new Storyboard(); 
sb.Children.Add(fade); 

sb.Begin(); 
+1

मैं इस उत्तर के साथ परेशानी में भाग गया क्योंकि हम .NET 3.0 को लक्षित कर रहे हैं; भले ही SetTarget को .NET 3.0 SP2 में जोड़ा गया है, यह केवल .NET 3.5 इंस्टॉलर के साथ उपलब्ध है; इसलिए यदि आप .NET 3.0 SP1 का समर्थन करना चाहते हैं, तो मुझे "sb.begin (this)" में बदलने के लिए कार्लोस के समाधान का उपयोग करने की आवश्यकता है। –

+1

[यहां एक प्रश्न है] (http://stackoverflow.com/questions/13217221/settarget-vs-registername-settargetname) जो उस मामले को दिखाता है जहां 'SetTarget' काम नहीं करता है और' RegisterName'/'SetTargetName' combo है ज़रूरी। – dharmatech

+1

ग्रेट जॉब ... अच्छा –

5

मैं मानता हूँ, namescopes शायद रहे हैं इस परिदृश्य के लिए उपयोग करने के लिए गलत बात है। SetTargetName के बजाय SetTarget का उपयोग करना बहुत आसान और आसान है।

यदि यह किसी और की सहायता करता है, तो यहां एक ऐसी तालिका में एक विशेष सेल को हाइलाइट करने के लिए उपयोग किया जाता है जो कुछ भी नहीं जब आप कोई नया उत्तर जोड़ते हैं तो यह स्टैक ओवरफ्लो हाइलाइट की तरह थोड़ा सा है।

TableCell cell = table.RowGroups[0].Rows[row].Cells[col]; 

    // The cell contains just one paragraph; it is the first block 
    Paragraph p = (Paragraph)cell.Blocks.FirstBlock; 

    // Animate the paragraph: fade the background from Yellow to White, 
    // once, through a span of 6 seconds. 

    SolidColorBrush brush = new SolidColorBrush(Colors.Yellow); 
    p.Background = brush; 
    ColorAnimation ca1 = new ColorAnimation() 
    { 
      From = Colors.Yellow, 
      To = Colors.White, 
      Duration = new Duration(TimeSpan.FromSeconds(6.0)), 
      RepeatBehavior = new RepeatBehavior(1), 
      AutoReverse = false, 
    }; 

    brush.BeginAnimation(SolidColorBrush.ColorProperty, ca1); 
11

मैं शुरू विधि में पैरामीटर के रूप में इस का उपयोग कर समस्या हल हो, कोशिश:

sb.Begin(this); 

क्योंकि नाम विंडो में पंजीकृत है।

+0

धन्यवाद, यह बहुत ही उपयोगी युक्ति मेरी समस्या को हल करती है – Tobias

+0

+1 यह किसी भी नए कोड को कोड किए बिना बिल्कुल समस्या हल करती है। – Sonhja

+0

जैसा कि मेरी कहानी बोर्ड app.xaml संसाधनों में परिभाषित किया गया था, मुझे पैरामीटर को एसबी.बजिन (App.Current.MainWindow) के रूप में जोड़ने की आवश्यकता थी; – Chandru

0

यह संभव अजीब बात है लेकिन मेरे समाधान दोनों विधियों का उपयोग है:

Storyboard.SetTargetName(DA, myObjectName); 

Storyboard.SetTarget(DA, myRect); 

sb.Begin(this); 

इस मामले में कोई त्रुटि नहीं है।

कोड पर एक नज़र डालें जहां मैंने इसका इस्तेमाल किया है।

int n = 0; 
     bool isWorking; 
     Storyboard sb; 
     string myObjectName; 
     UIElement myElement; 

     int idx = 0; 

     void timer_Tick(object sender, EventArgs e) 
     { 
      if (isWorking == false) 
      { 
       isWorking = true; 
       try 
       { 
         myElement = stackObj.Children[idx]; 

        var possibleIDX = idx + 1; 
        if (possibleIDX == stackObj.Children.Count) 
         idx = 0; 
        else 
         idx++; 

        var myRect = (Rectangle)myElement; 

        // Debug.WriteLine("TICK: " + myRect.Name); 

        var dur = TimeSpan.FromMilliseconds(2000); 

        var f = CreateVisibility(dur, myElement, false); 

        sb.Children.Add(f); 

        Duration d = TimeSpan.FromSeconds(2); 
        DoubleAnimation DA = new DoubleAnimation() { From = 1, To = 0, Duration = d }; 

        sb.Children.Add(DA); 
        myObjectName = myRect.Name; 
        Storyboard.SetTargetName(DA, myObjectName); 
        Storyboard.SetTarget(DA, myRect); 

        Storyboard.SetTargetProperty(DA, new PropertyPath("Opacity")); 

        sb.Begin(this); 

        n++; 
       } 
       catch (Exception ex) 
       { 
        Debug.WriteLine(ex.Message + " " + DateTime.Now.TimeOfDay); 
       } 

       isWorking = false; 
      } 
     } 
संबंधित मुद्दे