属性元数据已在“时间轴”属性中注册

时间:2014-01-03 05:53:11

标签: wpf multithreading timeline

我有一个由客户端软件调用的WPF应用程序。它第一次工作正常。当我从客户端软件关闭WPF应用程序并再次加载WPF应用程序(不关闭其间的客户端软件))时,它会引发异常,因为“属性元数据已经注册为”时间轴“属性“代码如下:

Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),
               new FrameworkPropertyMetadata { DefaultValue = 5 });

然后,我从我的应用程序评论了上面的代码行,并再次重复了我上面提到的相同场景,它在Run中抛出异常为“调用者线程无法访问此对象,因为不同的线程拥有它” )。

以下是我在WPF应用程序中使用Timeline属性的方法。

public void start()
{
    Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),
       new FrameworkPropertyMetadata { DefaultValue = 5 });
    //Property Metadata is already registered for the "Timeline" property.

    Run();
    // The caller thread cannot access this object because a different thread owns it.
}

1 个答案:

答案 0 :(得分:24)

您应该始终覆盖静态构造函数中的元数据。您不需要覆盖每个实例或方法。

在您的类的静态构造函数中移动此代码:

Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),
               new FrameworkPropertyMetadata { DefaultValue = 5 });

来自MSDN

  

必须在之前完成覆盖依赖项属性的元数据   该物业被物业系统使用(这等同于   到注册的对象的特定实例的时间   属性被实例化)。 必须是对OverrideMetadata的调用   在提供的类型的静态构造函数内执行   本身作为OverrideMetadata的forType参数。

在此处阅读更多内容 - How to override metadata?


无法修改后台线程中的UI内容,将其放在UI调度程序上,如下所示:

App.Current.Dispatcher.Invoke(new Action(() => Run()));