Home > Softwareentwicklung > WPF Code im Kontext eines Designers

WPF Code im Kontext eines Designers

January 4th, 2009 Bernd

Manchmal ist es hilfreich zu wissen, ob eine Stück WPF Code gerade im Design Modus von Visual Studio läuft oder nicht.

Beim Experimentieren mit Caliburn bin ich auf ein Problem mit dessen “ResolveExtension” gestoßen. Hierbei handelt es sich um eine Custom Markup Extension, die auf den für Caliburn konfigurierten DI-Container zugreift. Wird nun eine XAML Datei, welche diese Markup Extension verwendet, im Design Modus betrachtet, wird diese Markup Extension ausgeführt. Caliburn wirft dann eine Exception, da der DI-Container auf den zugegriffen werden soll nicht initialisiert ist. Das hat zur Folge, dass diese Datei nicht im Designer verwendet werden kann.

Eine mögliche Lösung dieses Problems besteht darin, im Code der Markup Extension zu überprüfen ob man sich gerade im Design Modus befindet. Dazu bietet .Net im Namespace System.ComponentModel die Klasse DesignerProperties. Mit folgendem Aufruf erfolgt die Überprüfung:

if( DesignerProperties.GetIsInDesignMode( new DependencyObject() ) )
{
    // tu was
}

Im Falle von Caliburn sieht dann die ProvideValue Methode der ResolveExtension so aus:

public override object ProvideValue( IServiceProvider serviceProvider )
{
    if( DesignerProperties.GetIsInDesignMode( new DependencyObject() ) )
    {
        return null;
    }

    if( string.IsNullOrEmpty( Key ) )
    {
        return DI.Container.Resolve( Type );
    }
    return Type == null ? DI.Container.Resolve( Key ) : DI.Container.Resolve( Type, Key );
}

Das Ganze funktioniert sowohl für den Visual Studio Designer als auch für Expression Blend.

Kick it on dotnet-kicks.de
Categories: Softwareentwicklung Tags:
Comments are closed.