Ottenere il Template base di un controllo
In molte occasioni capita di dover ridefinire l'aspetto di controlli con WPF utilizzando, naturalmente, la proprietà Template.
Molte volte l'operazione è abbastanza semplice ma, in caso di controlli "complessi" quest'operazione può diventare rognosa!
Mi è capitato proprio in questi giorni di dover ridefinire l'aspetto di un controllo ListView che è abbastanza complesso come struttura visto che al suo interno ci sono columns, scrollview, etc...
Cercando in rete ho trovato una soluzione al mio problema che ci da la possibilità di conoscere il ControlTemplate base del controllo ed utilizzare questo come punto di partenza.
Per fare questo ci viene in aiuto la classe XamlWriter che espone un metodo statico Save() che permette la serializzazione di qualsiaasi oggetto.
string xaml = System.Windows.Markup.XamlWriter.Save(myListView.Template);
Avremo in questo modo la definizione (xaml) del ControlTemplate che potremo, quindi, modificare in base alle nostre esigenze.
1 <ControlTemplate TargetType="ListView"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:s="clr-namespace:System;assembly=mscorlib">
6 <mwt:ClassicBorderDecorator BorderBrush="{TemplateBinding Border.BorderBrush}"
7 BorderStyle="Sunken"
8 BorderThickness="{TemplateBinding Border.BorderThickness}"
9 Name="Bd" Background="{TemplateBinding Panel.Background}"
10 SnapsToDevicePixels="True">
11 <ScrollViewer
12 Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
13 Padding="{TemplateBinding Control.Padding}">
14 <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
15 </ScrollViewer>
16 </mwt:ClassicBorderDecorator>
17 <ControlTemplate.Triggers>
18 <Trigger Property="ItemsControl.IsGrouping">
19 <Setter Property="ScrollViewer.CanContentScroll">
20 <Setter.Value>
21 <s:Boolean>False</s:Boolean>
22 </Setter.Value>
23 </Setter>
24 <Trigger.Value>
25 <s:Boolean>True</s:Boolean>
26 </Trigger.Value>
27 </Trigger>
28 <Trigger Property="UIElement.IsEnabled">
29 <Setter Property="Panel.Background" TargetName="Bd"
30 Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
31 <Trigger.Value>
32 <s:Boolean>False</s:Boolean>
33 </Trigger.Value>
34 </Trigger>
35 </ControlTemplate.Triggers>
36 </ControlTemplate>