WPF ed ereditarietà visuale

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.

Technorati Tags: ,,

Print | posted on Thursday, January 14, 2010 7:34 PM