Programmatically Extract an Element's Style with DefaultStyleKeyProperty
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WPF" Height="120" Width="220">
<Window.Resources>
<Style x:Key="CustomProgressBarStyle" TargetType="{x:Type ProgressBar}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ProgressBar}">
<Grid>
<Border Name="PART_Track" Background="{DynamicResource {x:Static SystemColors.InactiveCaptionBrushKey}}"
BorderBrush="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}"
BorderThickness="1" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel>
<ProgressBar x:Name="MyProgressBar" Value="30" Width="200" HorizontalAlignment="Center" Style="{DynamicResource CustomProgressBarStyle}"/>
<Button Click="Button_Click" Content="Extract Style"/>
</StackPanel>
</Window>
//File:Window.xaml.vb
Imports System
Imports System.Reflection
Imports System.Windows
Imports System.Windows.Markup
Namespace WpfApplication1
Public Partial Class Window1
Inherits Window
Public Sub New()
InitializeComponent()
End Sub
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
Dim type As Type = GetType(FrameworkElement)
Dim fieldInfo As FieldInfo = type.GetField("DefaultStyleKeyProperty", BindingFlags.[Static] Or BindingFlags.NonPublic)
Dim defaultStyleKeyProperty As DependencyProperty = DirectCast(fieldInfo.GetValue(MyProgressBar), DependencyProperty)
Dim defaultStyleKey As Object = MyProgressBar.GetValue(defaultStyleKeyProperty)
Dim style As Style = DirectCast(Application.Current.FindResource(defaultStyleKey), Style)
Dim styleXaml As String = XamlWriter.Save(style)
Console.WriteLine(styleXaml)
End Sub
End Class
End Namespace
Related examples in the same category