Programmatically Extract an Element's Style with DefaultStyleKeyProperty

image_pdfimage_print


   
  

<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.cs

using System;
using System.Reflection;
using System.Windows;
using System.Windows.Markup;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Type type = typeof(FrameworkElement);
            FieldInfo fieldInfo = type.GetField("DefaultStyleKeyProperty",BindingFlags.Static| BindingFlags.NonPublic);

            DependencyProperty defaultStyleKeyProperty =(DependencyProperty)fieldInfo.GetValue(MyProgressBar);

            object defaultStyleKey = MyProgressBar.GetValue(defaultStyleKeyProperty);
            Style style = (Style)Application.Current.FindResource(defaultStyleKey);
            string styleXaml = XamlWriter.Save(style);
            Console.WriteLine(styleXaml);
        }
    }
}