2011-06-05 82 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