Gibt es eine DesignMode-Eigenschaft in WPF?

101

In Winforms kann man sagen

if ( DesignMode )
{
  // Do something that only happens on Design mode
}

Gibt es so etwas in WPF?

Russ
quelle
2
Beachten Sie, dass GetIsInDesignMode unter dem gleichen enormen Fehler
BlueRaja - Danny Pflughoeft

Antworten:

152

In der Tat gibt es :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Beispiel:

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

public class MyUserControl : UserControl
{
    public MyUserControl()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            // Design-mode specific functionality
        }
    }
}
Enrico Campidoglio
quelle
Ich habe Ihre Lösung in meiner Anwendung angewendet, aber sie funktioniert nicht. Ich habe es hier gefragt stackoverflow.com/questions/3987439/… . Wenn Sie möchten, schließen Sie sich uns an und diskutieren Sie.
Nam G VU
@serhio Danke, dass du darauf hingewiesen hast. Kennen Sie eine Problemumgehung? Übrigens scheint es auch in Silverlight nicht zu funktionieren: connect.microsoft.com/VisualStudio/feedback/details/371837/…
Enrico Campidoglio
In VS2019 Enable project codemuss der Schalter aktiviert sein (oder Menü-> Design-> 🗹 Projektcode ausführen).
marbel82
47

In einigen Fällen muss ich wissen, ob ein Aufruf meiner Nicht-UI-Klasse vom Designer initiiert wird (z. B. wenn ich eine DataContext-Klasse aus XAML erstelle). Dann ist der Ansatz aus diesem MSDN-Artikel hilfreich:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}
Max Galkin
quelle
Ich habe Ihre Lösung in meiner Anwendung angewendet, aber sie funktioniert nicht. Ich habe es hier gefragt stackoverflow.com/questions/3987439/… . Wenn Sie möchten, schließen Sie sich uns an und diskutieren Sie.
Nam G VU
20

Für alle WPF - Steuerelemente in WinForms gehostet , DesignerProperties.GetIsInDesignMode(this)funktioniert nicht.

Also habe ich einen Fehler in Microsoft Connect erstellt und eine Problemumgehung hinzugefügt:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}
Serhio
quelle
Sollte es nicht GetEntryAssembly()statt sein GetExecutingAssembly()? Letzterer sollte die Assembly zurückgeben, in der diese Eigenschaft definiert ist
fjch1997
7

Späte Antwort, ich weiß - aber für alle anderen, die dies in einer DataTriggeroder irgendwo in XAML im Allgemeinen verwenden möchten:

xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework"

<Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, 
                 Path=(componentModel:DesignerProperties.IsInDesignMode)}" 
                 Value="True">
        <Setter Property="Visibility" Value="Visible"/>
    </DataTrigger>
</Style.Triggers>
Manfred Radlwimmer
quelle
0

Verwende das hier:

if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
    //design only code here
}

(Async- und Dateioperationen funktionieren hier nicht)

Zum Instanziieren eines Entwurfszeitobjekts in XAML (d ist der spezielle Designer-Namespace)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>
Jeson Martajaya
quelle
Diese Klasse ( Windows.ApplicationModel) ist für Store-Apps vorgesehen, die in der Windows Runtime-API enthalten sind. Dies ist keine sofort einsatzbereite WPF-Lösung, wenn Sie nur an einer normalen Windows-Desktopanwendung arbeiten.
QJake