Mega Code Archive

 
Categories / C# / WPF
 

Programmatically Extract an Elements 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.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);         }     } }