Czy w WPF istnieje właściwość DesignMode?

Odpowiedzi:

153

Rzeczywiście jest :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Przykład:

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
źródło
Zastosowałem Twoje rozwiązanie w mojej aplikacji, ale nie działa. Zapytałem o to tutaj stackoverflow.com/questions/3987439/… . Jeśli tak, dołącz do nas i dyskutuj.
Nam G VU
@serhio Dzięki za wskazanie tego. Czy znasz jakieś obejście? Przy okazji wygląda na to, że nie działa też w Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837/ ...
Enrico Campidoglio
W VS2019 przełącznik Enable project codemusi być włączony (lub Menu-> Projekt-> 🗹 Uruchom kod projektu).
marbel82
47

W niektórych przypadkach muszę wiedzieć, czy wywołanie mojej klasy innej niż UI jest inicjowane przez projektanta (na przykład w przypadku tworzenia klasy DataContext z XAML). Wtedy pomocne jest podejście z tego artykułu MSDN :

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}
Max Galkin
źródło
Zastosowałem Twoje rozwiązanie w mojej aplikacji, ale nie działa. Zapytałem o to tutaj stackoverflow.com/questions/3987439/… . Jeśli tak, dołącz do nas i dyskutuj.
Nam G VU
20

Dla żadnych kontrolek WPF hostowanych w WinForms , DesignerProperties.GetIsInDesignMode(this)nie działa.

Więc utworzyłem błąd w Microsoft Connect i dodałem obejście:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}
serhio
źródło
Czy nie powinno być GetEntryAssembly()zamiast tego GetExecutingAssembly()? Ten ostatni powinien zwrócić zestaw, w którym ta właściwość jest zdefiniowana
fjch1997
7

Wiem, że późna odpowiedź, ale dla każdego, kto chce użyć tego w a DataTriggerlub gdziekolwiek w XAML w ogóle:

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
źródło
0

Użyj tego:

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

(Operacje asynchroniczne i na plikach nie będą tutaj działać)

Ponadto, aby utworzyć wystąpienie obiektu czasu projektowania w XAML (d to specjalna przestrzeń nazw projektanta)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>
Jeson Martajaya
źródło
Ta klasa ( Windows.ApplicationModel) jest przeznaczona dla aplikacji ze sklepu, zawartych w interfejsie Windows Runtime API. To nie jest gotowe rozwiązanie WPF, jeśli pracujesz tylko na zwykłej aplikacji klasycznej systemu Windows.
qJake,