代码中的DataTrigger

时间:2011-06-05 02:21:18

标签: wpf datatrigger

我试图让这个工作,基于我收到的答案 [使用WPF将一些XAML转换为C#] [1] ,但我遗漏了一些东西。

我在下面粘贴了我的代码示例。

// 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();

1 个答案:

答案 0 :(得分:3)

您的代码中存在多个错误:

  1. 你正在创建一个样式,但你不在任何地方使用它,你错过了这个行

    ellipse2.Style = style;
    
  2. 您正在尝试绑定名称为ellipse1的元素,但它不存在(具有该名称的变量不是同一个东西)。但即使您设置Name的{​​{1}},它也行不通。您必须在XAML中声明该名称。在代码隐藏中,您可以使用ellipse1并直接绑定到另一个椭圆,而不使用名称(无论如何,这将是一个更好的解决方案,即使使用名称也是如此):

    Source
  3. 您正在比较两个双打是否完全相同的值。这几乎总是一个坏主意,特别是在这种情况下。 trigger.Binding = new Binding("Opacity") { Source = ellipse1 }; 的{​​{1}}不会连续变化,而是通过跳跃而变化。默认情况下,该值每秒最多变化60次(至少在我测试它时是这样,我没有发现任何地方都记录了这个值)。因此,Opacity可能从0开始,保持1/60秒,然后跳到1/60。因此,比较精确值甚至比通常比较双精度时更不可靠(开始时不可靠)。使用转换器检查不透明度是否大于ellispse1似乎对我有用,但它仍然不可靠:如果调度程序忙,不透明度可以从0.85直接跳到0.12。

    Opacity
    0.99
  4. 显然

      

    Style中的Storyboard树无法指定TargetName。删除TargetName。

    所以删除以下内容,无论如何它都没用。

    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();
        }
    }