我有一个由客户端软件调用的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.
}
答案 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()));