2011-06-05 32 views
-1

我試圖得到這個工作,根據我收到的回答[使用WPF將一些XAML轉換爲C#] [1],但我錯過了一些東西。DataTrigger代碼

我粘貼了下面我的代碼樣本。

// uGrid = UniformGrid 
uGrid.Columns=2; 
// test - setup first ellipse 
Ellipse ellipse1 = new Ellipse() { Width=25, Height=25, Fill=Brushes.DodgerBlue, Margin= new Thickness(3), Opacity=0 }; 
uGrid.Children.Add(ellipse1); 
var fadeEllipse1 = new DoubleAnimation() { From = 0, To = 1, Duration = TimeSpan.FromSeconds(this.secondsToFade), FillBehavior=FillBehavior.Stop }; 
Storyboard.SetTarget(fadeEllipse1, ellipse1); 
Storyboard.SetTargetProperty(fadeEllipse1, new PropertyPath(Ellipse.OpacityProperty)); 
Storyboard storyBoard = new Storyboard(); 

storyBoard.Children.Add(fadeEllipse1); 
storyBoard.RepeatBehavior=RepeatBehavior.Forever; 

// test - setup 2nd ellipse using example below 
Ellipse ellipse2 = new Ellipse() { Width=25, Height=25, Fill=Brushes.DodgerBlue, Margin= new Thickness(3), Opacity=0 }; 
uGrid.Children.Add(ellipse2); 

var style = new Style(typeof(Ellipse)); 
var trigger = new DataTrigger(); 
trigger.Binding = new Binding("Opacity") { ElementName = "ellipse1" }; 
trigger.Value = 1; 

Storyboard sb = new Storyboard(); 

var fadeEllipse2 = new DoubleAnimation() { From = 0, To = 1, Duration = TimeSpan.FromSeconds(this.secondsToFade), FillBehavior=FillBehavior.Stop }; 
Storyboard.SetTarget(fadeEllipse2, ellipse2); 
Storyboard.SetTargetProperty(fadeEllipse2, new PropertyPath(Ellipse.OpacityProperty)); 
Storyboard.SetTargetName(fadeEllipse2, ellipse2.Name); 
sb.Children.Add(fadeEllipse2); 
sb.RepeatBehavior=RepeatBehavior.Forever; 

trigger.EnterActions.Add(new BeginStoryboard() { Storyboard = sb }); 
style.Triggers.Add(trigger); 

storyBoard.Begin(); 
+0

有什麼問題嗎? – svick 2011-06-05 14:02:27

+0

對不起。附加到ellipse2的第二個故事板從不觸發,當ellipse1不透明度達到1時,我嘗試了trigger.value的不同值 - .7,.5 - 我設置了一些錯誤並且沒有觸發。 – Terco 2011-06-05 17:08:56

+0

我看到我得到了兩個大拇指,如果有人讓我知道我做了什麼會更有建設性,所以我知道在未來應該避免什麼。 – Terco 2011-06-05 17:10:40

回答

3

有在你的代碼的幾個誤區:

  1. 你正在創建一種風格,但你沒有在任何地方使用它,你就錯過了線

    ellipse2.Style = style; 
    
  2. 您試圖綁定到名稱爲ellipse1的元素,但它不存在(具有該名稱的變量不是相同的東西)。但即使你設置了ellipse1Name,它也不起作用。您必須在XAML中爲此聲明名稱。在代碼隱藏,你可以使用Source並綁定到直接在其他橢圓形,不使用名稱(這將是一個更好的解決辦法,無論如何,即使使用名稱的工作):

    trigger.Binding = new Binding("Opacity") { Source = ellipse1 }; 
    
  3. 你比較兩個是否雙打有完全相同的值。這幾乎總是一個壞主意,在這種情況下尤其如此。 ellispse1Opacity不會連續變化,它會跳躍變化。默認情況下,該值每秒最多改變60次(至少在我測試時這種方式是這樣的,我沒有在任何地方找到這個值)。因此,Opacity可能從0開始,保持1/60秒,然後跳到1/60。正因爲如此,比較正確的價值比通常比較平等的雙倍(這是不可靠的開始)更不可靠。使用轉換器檢查,不透明度是否大於0.99似乎對我有效,但它仍然不可靠:如果調度員忙,則不透明度可以從0.85直線跳到0.12。

    public class GreaterThanConverter : IValueConverter 
    { 
        public object Convert(
         dynamic value, Type targetType, dynamic parameter, CultureInfo culture) 
        { 
         return value > parameter; 
        } 
    
        public object ConvertBack(
         object value, Type targetType, object parameter, CultureInfo culture) 
        { 
         throw new NotSupportedException(); 
        } 
    } 
    
    trigger.Binding = new Binding("Opacity") 
            { 
             Source = ellipse1, 
             Converter = new GreaterThanConverter(), 
             ConverterParameter = 0.99 
            }; 
    trigger.Value = true; 
    
  4. 顯然

    在Style故事板樹不能指定的TargetName。刪除TargetName。

    因此,刪除以下內容,反正無用。

    Storyboard.SetTargetName(fadeEllipse2, ellipse2.Name); 
    
+0

謝謝你的幫助。 – Terco 2011-06-06 01:31:25