Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.5k views
in Technique[技术] by (71.8m points)

wpf - Property Metadata is already registered for “Timeline” property

I am having a WPF application which is called by a client software. It works fine for the 1st time.When I closed the WPF application from the client software and again load the WPF app(without closing the client software in between)), it throws an exception as "Property Metadata is already registered for “Timeline” property" for the below code:

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

And then, I commented the above line of code from my app and again repeated the same scenario which I mentioned above, it throws an exception as "The caller thread cannot access this object because a different thread owns it" in Run().

Below is the method which I am using Timeline property in my WPF application.

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.
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You should override metadata in static constructor always . You don't need to override with every instance or method.

Move this code in static constructor of your class:

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

From MSDN:

Overriding metadata on a dependency property must be done prior to that property being placed in use by the property system (this equates to the time that specific instances of objects that register the property are instantiated). Calls to OverrideMetadata must be performed within the static constructors of the type that provides itself as the forType parameter of OverrideMetadata.

Read more here - How to override metadata?


You cannot modify UI stuff from background thread, put it on UI dispatcher like this:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...