Una delle “mancanze” che alcuni lamentano in WPF è l’assenza dell’ereditarietà visuale delle Window e dei UserControl.
In realtà (come per le griglie :-)) non è un problema, esistono semplici meccanismi che permettono di ottenere lo stesso risultato.
Una delle tecniche è quella di utilizzare un template per stilare una BaseWindow o un BaseControl:
Supponiamo di avere una BaseView (Window) base dalla quale facciamo derivare tutte le finestre della nostra applicazione:
Definiremo una classe BaseView che eredita da Window e avrà tutti i metodi/propriertà necessarie:
public class BaseView : Window
{
// ...
}
Questa è solo una classe e non ha parte visuale.
La parte “visuale” la disegno con Expression Blend come stile della BaseView e vado a ridefinire il ControlTemplate mettendo al suo interno tutti i controlli che voglio vedere in tutte le finestre che ereditano:
<Style TargetType="{x:Type Common:BaseView}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Common:BaseView}">
<StacckPanel>
<!-- Altri controlli: toolbar? -->
<ContentPresenter/>
<!-- Altri controlli: footer? -->
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Questo stile viene poi applicato a tutte i controlli di tipo BaseView che avranno quindi tutti un aspetto comune.
Quindi per sfruttare il template è sufficiente che le finestre dell'applicazione ereditino da BaseView:
<MyApplication:BaseView>
....
</MyApplication:BaseView>
UPDATE: ho messo un progetto d’esempio qui.