diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index baebf33..152f185 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -536,6 +536,14 @@ { "source_path": "dotnet-desktop-guide/framework/wpf/properties/dependency-property-metadata.md", "redirect_url": "/dotnet/desktop/wpf/advanced/dependency-property-metadata?view=netframeworkdesktop-4.8" + }, + { + "source_path": "dotnet-desktop-guide/net/wpf/advanced/how-to-override-metadata-for-a-dependency-property.md", + "redirect_url": "/dotnet/desktop/wpf/properties/how-to-override-metadata-for-a-dependency-property?view=netdesktop-5.0" + }, + { + "source_path": "dotnet-desktop-guide/framework/wpf/properties/how-to-override-metadata-for-a-dependency-property.md", + "redirect_url": "/dotnet/desktop/wpf/advanced/how-to-override-metadata-for-a-dependency-property?view=netframeworkdesktop-4.8" } ] } diff --git a/dotnet-desktop-guide/net/wpf/properties/dependency-property-metadata.md b/dotnet-desktop-guide/net/wpf/properties/dependency-property-metadata.md index 03f79fb..f036e6b 100644 --- a/dotnet-desktop-guide/net/wpf/properties/dependency-property-metadata.md +++ b/dotnet-desktop-guide/net/wpf/properties/dependency-property-metadata.md @@ -38,7 +38,7 @@ The class stores most of the metadata use - Types that add themselves as an owner of a dependency property. -If a type registers a dependency property without specifying metadata, the property system assigns a default `PropertyMetadata` object with default values for that type to the dependency property. +If a type registers a dependency property without specifying metadata, the property system assigns a `PropertyMetadata` object with default values for that type to the dependency property. To retrieve metadata for a dependency property, call one of the overloads on the identifier. The metadata is returned as a `PropertyMetadata` object. diff --git a/dotnet-desktop-guide/net/wpf/properties/how-to-override-metadata-for-a-dependency-property.md b/dotnet-desktop-guide/net/wpf/properties/how-to-override-metadata-for-a-dependency-property.md new file mode 100644 index 0000000..137b3d2 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/how-to-override-metadata-for-a-dependency-property.md @@ -0,0 +1,39 @@ +--- +title: "How to override metadata for a dependency property" +description: "Learn how to override a dependency property in Windows Presentation Foundation (WPF) by calling the OverrideMetadata method." +ms.date: "11/04/2021" +dev_langs: + - "csharp" + - "vb" +helpviewer_keywords: + - "metadata [WPF], overriding for dependency properties" + - "dependency properties [WPF], overriding metadata for" + - "overriding metadata for dependency properties [WPF]" +--- + + +# How to override metadata for a dependency property (WPF .NET) + +When you derive from a class that defines a dependency property, you inherit the dependency property and its metadata. This article describes how you can override the metadata of an inherited dependency property by calling the method. Overriding the metadata lets you modify characteristics of the inherited dependency property to match subclass-specific requirements. + +## Background + +A class that defines a dependency property can specify its characteristics in or one of its derived types, such as . Examples of those characteristics are the default value and callback references that trigger on property change and/or coercion value change. Many classes that define dependency properties, specify property metadata during dependency property registration. When metadata isn't specified during registration, the WPF property system assigns a `PropertyMetadata` object with default values. Derived classes that inherit dependency properties through class inheritance have the option to override the original metadata of any dependency property. In this way, derived classes can selectively modify dependency property characteristics to meet class requirements. When calling , a derived class specifies its own type as the first parameter, and a metadata instance as the second parameter. + +A derived class that overrides metadata on a dependency property must do so before the property is placed in use by the property system. A dependency property is placed in use when any instance of the class that registers the property is instantiated. To help meet this requirement, the derived class should call within its static constructor. Overriding the metadata of a dependency property after its owner type is instantiated won't raise exceptions, but will result in inconsistent behaviors in the property system. Also, a derived type can't override the metadata of a dependency property more than once, and attempts to do so will raise an exception. + +## Example + +In the following example, the derived class `TropicalAquarium` overrides the metadata of a dependency property inherited from the base class `Aquarium`. The metadata type is , which supports UI-related WPF framework characteristics such as . The derived class doesn't override the inherited `AffectsRender` flag, but it does update the default value of `AquariumGraphic` on derived class instances. + +:::code language="csharp" source="./snippets/how-to-override-metadata-for-a-dependency-property/csharp/MainWindow.xaml.cs" id="BaseDependencyProperty"::: +:::code language="vb" source="./snippets/how-to-override-metadata-for-a-dependency-property/vb/MainWindow.xaml.vb" id="BaseDependencyProperty"::: +:::code language="csharp" source="./snippets/how-to-override-metadata-for-a-dependency-property/csharp/MainWindow.xaml.cs" id="InheritedDependencyProperty"::: +:::code language="vb" source="./snippets/how-to-override-metadata-for-a-dependency-property/vb/MainWindow.xaml.vb" id="InheritedDependencyProperty"::: + +## See also + +- +- [Dependency property metadata](dependency-property-metadata.md) +- [Dependency properties overview](dependency-properties-overview.md) +- [Custom dependency properties](custom-dependency-properties.md) diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/App.xaml.cs b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/App.xaml.cs new file mode 100644 index 0000000..3128552 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace CodeSampleCsharp +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/AssemblyInfo.cs b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/AssemblyInfo.cs new file mode 100644 index 0000000..8b5504e --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/CodeSampleCsharp.csproj b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/CodeSampleCsharp.csproj new file mode 100644 index 0000000..8824b2f --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/CodeSampleCsharp.csproj @@ -0,0 +1,24 @@ + + + + WinExe + net5.0-windows + true + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/MainWindow.xaml b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/MainWindow.xaml new file mode 100644 index 0000000..727f1b5 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/MainWindow.xaml @@ -0,0 +1,8 @@ + + + + diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/MainWindow.xaml.cs b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/MainWindow.xaml.cs new file mode 100644 index 0000000..49340a6 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/MainWindow.xaml.cs @@ -0,0 +1,75 @@ +using System; +using System.Windows; + +namespace CodeSampleCsharp +{ + /// + /// Interaction logic for MainWindow.xaml. + /// + public partial class MainWindow : Window + { + public MainWindow() => InitializeComponent(); + + public void ValidateSnippet(object sender, RoutedEventArgs e) + { + TropicalAquarium tropicalAquarium = new(); + Aquarium aquarium = new(); + + FrameworkPropertyMetadata aquariumPropertyMetadata = (FrameworkPropertyMetadata)Aquarium.AquariumGraphicProperty.GetMetadata(aquarium); + FrameworkPropertyMetadata tropicalAquariumPropertyMetadata = (FrameworkPropertyMetadata)Aquarium.AquariumGraphicProperty.GetMetadata(tropicalAquarium); + + lblMessage.Content = $"Tropical aquarium graphic URL: " + $"{tropicalAquarium.AquariumGraphic.OriginalString}" + Environment.NewLine; + lblMessage.Content += $"Aquarium graphic URL: " + $"{aquarium.AquariumGraphic.OriginalString}" + Environment.NewLine; + + lblMessage.Content += $"Queried owner-type AquariumGraphic default value: " + $"{aquariumPropertyMetadata.DefaultValue}" + Environment.NewLine; + lblMessage.Content += $"Queried owner-type AquariumGraphic affects render: " + $"{aquariumPropertyMetadata.AffectsRender}" + Environment.NewLine; + + lblMessage.Content += $"Queried derived-type TropicalAquarium default value: " + $"{tropicalAquariumPropertyMetadata.DefaultValue}" + Environment.NewLine; + lblMessage.Content += $"Queried derived-type TropicalAquarium affects render: " + $"{tropicalAquariumPropertyMetadata.AffectsRender}" + Environment.NewLine; + } + } + + // + public class Aquarium : DependencyObject + { + // Register a dependency property with the specified property name, + // property type, owner type, and property metadata. + public static readonly DependencyProperty AquariumGraphicProperty = + DependencyProperty.Register( + name: "AquariumGraphic", + propertyType: typeof(Uri), + ownerType: typeof(Aquarium), + typeMetadata: new FrameworkPropertyMetadata( + defaultValue: new Uri("http://www.contoso.com/aquarium-graphic.jpg"), + flags: FrameworkPropertyMetadataOptions.AffectsRender) + ); + + // Declare a read-write CLR wrapper with get/set accessors. + public Uri AquariumGraphic + { + get => (Uri)GetValue(AquariumGraphicProperty); + set => SetValue(AquariumGraphicProperty, value); + } + } + // + + // + public class TropicalAquarium : Aquarium + { + // Static constructor. + static TropicalAquarium() + { + // Create a new metadata instance with a modified default value. + FrameworkPropertyMetadata newPropertyMetadata = new( + defaultValue: new Uri("http://www.contoso.com/tropical-aquarium-graphic.jpg")); + + // Call OverrideMetadata on the dependency property identifier. + // Pass in the type for which the new metadata will be applied + // and the new metadata instance. + AquariumGraphicProperty.OverrideMetadata( + forType: typeof(TropicalAquarium), + typeMetadata: newPropertyMetadata); + } + } + // +} diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/Properties/Resources.Designer.cs b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/Properties/Resources.Designer.cs new file mode 100644 index 0000000..64552f9 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CodeSampleCsharp.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CodeSampleCsharp.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/Properties/Resources.resx b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/Properties/Resources.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/app.xaml b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/app.xaml new file mode 100644 index 0000000..867d2f0 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/csharp/app.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/Application.xaml b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/Application.xaml new file mode 100644 index 0000000..f225972 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/Application.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/Application.xaml.vb b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/Application.xaml.vb new file mode 100644 index 0000000..084cbe9 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/Application.xaml.vb @@ -0,0 +1,6 @@ +Class Application + + ' Application-level events, such as Startup, Exit, and DispatcherUnhandledException + ' can be handled in this file. + +End Class diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/AssemblyInfo.vb b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/AssemblyInfo.vb new file mode 100644 index 0000000..025ee72 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/AssemblyInfo.vb @@ -0,0 +1,11 @@ +Imports System.Windows + +'The ThemeInfo attribute describes where any theme specific and generic resource dictionaries can be found. +'1st parameter: where theme specific resource dictionaries are located +'(used if a resource is not found in the page, +' or application resource dictionaries) + +'2nd parameter: where the generic resource dictionary is located +'(used if a resource is not found in the page, +'app, and any theme specific resource dictionaries) + diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/CodeSampleVb.vbproj b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/CodeSampleVb.vbproj new file mode 100644 index 0000000..c7ae1cc --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/CodeSampleVb.vbproj @@ -0,0 +1,22 @@ + + + + WinExe + net5.0-windows + CodeSampleVb + true + + + + + + + + + + + + + + + diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/MainWindow.xaml b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/MainWindow.xaml new file mode 100644 index 0000000..5fc8ee6 --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/MainWindow.xaml @@ -0,0 +1,8 @@ + + + + diff --git a/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/MainWindow.xaml.vb b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/MainWindow.xaml.vb new file mode 100644 index 0000000..596b9ea --- /dev/null +++ b/dotnet-desktop-guide/net/wpf/properties/snippets/how-to-override-metadata-for-a-dependency-property/vb/MainWindow.xaml.vb @@ -0,0 +1,81 @@ +Namespace CodeSampleVb + + ' + ' Interaction logic for MainWindow.xaml. + ' + Partial Public Class MainWindow + Inherits Window + + Public Sub New() + InitializeComponent() + End Sub + + Public Sub ValidateSnippet(sender As Object, e As RoutedEventArgs) + Dim tropicalAquarium As New TropicalAquarium() + Dim aquarium As New Aquarium() + + Dim aquariumPropertyMetadata As FrameworkPropertyMetadata = CType(Aquarium.AquariumGraphicProperty.GetMetadata(aquarium), FrameworkPropertyMetadata) + Dim tropicalAquariumPropertyMetadata As FrameworkPropertyMetadata = CType(Aquarium.AquariumGraphicProperty.GetMetadata(tropicalAquarium), FrameworkPropertyMetadata) + + lblMessage.Content = $"Tropical aquarium graphic URL: {tropicalAquarium.AquariumGraphic.OriginalString}" & Environment.NewLine + lblMessage.Content += $"Aquarium graphic URL: {aquarium.AquariumGraphic.OriginalString}" & Environment.NewLine + + lblMessage.Content += $"Queried owner-type AquariumGraphic default value: {aquariumPropertyMetadata.DefaultValue}" & Environment.NewLine + lblMessage.Content += $"Queried owner-type AquariumGraphic affects render: {aquariumPropertyMetadata.AffectsRender}" & Environment.NewLine + + lblMessage.Content += $"Queried derived-type TropicalAquarium default value: {tropicalAquariumPropertyMetadata.DefaultValue}" & Environment.NewLine + lblMessage.Content += $"Queried derived-type TropicalAquarium affects render: {tropicalAquariumPropertyMetadata.AffectsRender}" & Environment.NewLine + End Sub + + End Class + + ' + Public Class Aquarium + Inherits DependencyObject + + ' Register a dependency property with the specified property name, + ' property type, owner type, and property metadata. + Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = + DependencyProperty.Register( + name:="AquariumGraphic", + propertyType:=GetType(Uri), + ownerType:=GetType(Aquarium), + typeMetadata:=New FrameworkPropertyMetadata( + defaultValue:=New Uri("http://www.contoso.com/aquarium-graphic.jpg"), + flags:=FrameworkPropertyMetadataOptions.AffectsRender)) + + ' Declare a read-write CLR wrapper with get/set accessors. + Public Property AquariumGraphic As Uri + Get + Return CType(GetValue(AquariumGraphicProperty), Uri) + End Get + Set + SetValue(AquariumGraphicProperty, Value) + End Set + End Property + + End Class + ' + + ' + Public Class TropicalAquarium + Inherits Aquarium + + ' Static constructor. + Shared Sub New() + ' Create a new metadata instance with a modified default value. + Dim newPropertyMetadata As New FrameworkPropertyMetadata( + defaultValue:=New Uri("http://www.contoso.com/tropical-aquarium-graphic.jpg")) + + ' Call OverrideMetadata on the dependency property identifier. + ' Pass in the type for which the new metadata will be applied + ' and the new metadata instance. + AquariumGraphicProperty.OverrideMetadata( + forType:=GetType(TropicalAquarium), + typeMetadata:=newPropertyMetadata) + End Sub + + End Class + ' + +End Namespace diff --git a/dotnet-desktop-guide/net/wpf/toc.yml b/dotnet-desktop-guide/net/wpf/toc.yml index 0b8ed23..c695eda 100644 --- a/dotnet-desktop-guide/net/wpf/toc.yml +++ b/dotnet-desktop-guide/net/wpf/toc.yml @@ -98,6 +98,8 @@ items: href: properties/how-to-implement-a-dependency-property.md - name: Register an attached property href: properties/how-to-register-an-attached-property.md + - name: Override dependency property metadata + href: properties/how-to-override-metadata-for-a-dependency-property.md - name: Resources items: - name: Overview diff --git a/redirects_generator/definitions.json b/redirects_generator/definitions.json index 858c22e..2b125de 100644 --- a/redirects_generator/definitions.json +++ b/redirects_generator/definitions.json @@ -359,6 +359,11 @@ "SourceUrl": "/dotnet/desktop/wpf/advanced/dependency-property-metadata?view=netframeworkdesktop-4.8", "TargetUrl": "/dotnet/desktop/wpf/properties/dependency-property-metadata?view=netdesktop-5.0" }, + { + "Redirect": "TwoWay", + "SourceUrl": "/dotnet/desktop/wpf/advanced/how-to-override-metadata-for-a-dependency-property?view=netframeworkdesktop-4.8", + "TargetUrl": "/dotnet/desktop/wpf/properties/how-to-override-metadata-for-a-dependency-property?view=netdesktop-5.0" + }, // Systems - XAML {