0

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

但是,当我尝试运行故事板来为这两个属性设置动画时,Silverlight 会引发灾难性错误。但是,如果我尝试仅对其中一个进行动画处理,则效果很好。如果我尝试为我的一个属性和一个“内置”属性(如不透明度)设置动画,它也可以工作。但是,如果我尝试为我的两个自定义属性设置动画,我会收到灾难性错误。

还有人遇到这个吗?

编辑:

两个 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 (在任何情况下都是绝对必要的),结果是一样的。在灾难性错误开始之前,事件处理程序甚至不会被调用。

4

3 回答 3

1

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

于 2008-09-17T19:49:23.057 回答
0

我会尝试在 OnPropertyChanged 中注释掉 InvalidateArrange 并看看会发生什么。

于 2008-09-16T13:16:56.207 回答
0

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

Silverlight 2 Release Candidate 0 今天发布了,我已经在上面测试过这个问题,它似乎已经修复了。现在,我的测试面板中的两个自定义 DP 都可以正确设置动画,因此应用程序的行为符合预期。这很好。

请注意,此 RC 只是基于开发人员的 RC,因此 Silverlight 的标准版本尚未更新。不过,我预计它将在下个月完全发布。

于 2008-09-26T17:31:19.437 回答