我们可以在Silverlight中设置自定义依赖项属性的动画吗?

时间:2020-03-05 18:53:19  来源:igfitidea点击:

我可能会错过一些非常明显的东西。我正在尝试编写一个自定义面板,其中根据几个依赖项属性对内容进行布局(我假设它们必须是DP,因为我希望能够对其进行动画处理。)

但是,当我尝试运行情节提要来对这两个属性进行动画处理时,Silverlight会引发严重错误。但是,如果我尝试仅对其中之一进行动画处理,则效果很好。而且,如果我尝试为我的一个属性和一个"内置"属性(例如Opacity)设置动画,它也可以工作。但是,如果我尝试对两个自定义属性进行动画处理,则会出现严重错误。

还有其他人遇到吗?

编辑:

两个DP分别是ScaleX和ScaleY都加倍。它们可缩放面板中子项的X和Y位置。这是其中之一的定义方式:

public double ScaleX
    {
        get { return (double)GetValue(ScaleXProperty); }
        set { SetValue(ScaleXProperty, value); }
    }

    /// <summary> 
    /// Identifies the ScaleX dependency property.
    /// </summary> 
    public static readonly DependencyProperty ScaleXProperty =
                DependencyProperty.Register(
                      "ScaleX",
                      typeof(double),
                      typeof(MyPanel),
                      new PropertyMetadata(OnScaleXPropertyChanged));

    /// <summary>
    /// ScaleXProperty property changed handler. 
    /// </summary>
    /// <param name="d">MyPanel that changed its ScaleX.</param>
    /// <param name="e">DependencyPropertyChangedEventArgs.</param> 
    private static void OnScaleXPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MyPanel _MyPanel = d as MyPanel;
        if (_MyPanel != null)
        {
            _MyPanel.InvalidateArrange(); 
        }
    }

    public static void SetScaleX(DependencyObject obj, double val)
    {
        obj.SetValue(ScaleXProperty, val);
    }

    public static double GetScaleX(DependencyObject obj)
    {
        return (double)obj.GetValue(ScaleXProperty);
    }

编辑:我已经尝试过,并且没有调用InvalidateArrange(在任何情况下都是绝对必要的),并且结果是相同的。在发生灾难性错误之前,事件处理程序甚至都不会被调用。

解决方案

回答

我会尝试注释掉OnPropertyChanged中的InvalidateArrange,然后看看会发生什么。

回答

这是Silverlight 2 Beta 2中已记录的错误。我们不能为同一对象设置两个自定义依赖项属性的动画。

回答

我希望回答我自己的问题也不错。

Silverlight 2候选发布版0已于今天发布,我已经对其进行了测试,并且似乎已修复。现在,我的测试面板中的两个自定义DP都可以正确设置动画了,因此该应用程序的行为符合预期。很好

请注意,此RC只是基于开发人员的RC,因此未更新Silverlight的标准版本。我希望它会在下个月完全发布。