Есть ли в WPF свойство DesignMode?

Ответы:

153

Действительно есть :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Пример:

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

public class MyUserControl : UserControl
{
    public MyUserControl()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            // Design-mode specific functionality
        }
    }
}
Энрико Кампидольо
источник
Я применил ваше решение в своем приложении, но оно не работает. Я спросил об этом здесь stackoverflow.com/questions/3987439/… . Если хотите, присоединяйтесь к нам и обсуждайте.
Nam G VU
@serhio Спасибо, что указали на это. Известно ли вам какое-либо решение? Кстати, похоже, что это не работает и в Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837/…
Enrico Campidoglio
В VS2019 переключатель Enable project codeдолжен быть включен (или Меню-> Дизайн-> 🗹 Выполнить код проекта).
marbel82
47

В некоторых случаях мне нужно знать, инициирован ли дизайнером вызов моего класса, не относящегося к пользовательскому интерфейсу (например, если я создаю класс DataContext из XAML). Тогда будет полезен подход из этой статьи MSDN :

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}
Макс Галкин
источник
Я применил ваше решение в своем приложении, но оно не работает. Я спросил об этом здесь stackoverflow.com/questions/3987439/… . Если хотите, присоединяйтесь к нам и обсуждайте.
Nam G VU
20

Для любых элементов управления WPF, размещенных в WinForms , DesignerProperties.GetIsInDesignMode(this)не работает.

Итак, я создал ошибку в Microsoft Connect и добавил обходной путь:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}
Серхио
источник
Разве не должно быть GetEntryAssembly()вместо GetExecutingAssembly()? Последний должен возвращать сборку, в которой определено это свойство
fjch1997
7

Поздний ответ, я знаю, но для всех, кто хочет использовать это DataTriggerв XAML или в любом другом месте в целом:

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>
Манфред Радлвиммер
источник
0

Используйте это:

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

(Асинхронные и файловые операции здесь не работают)

Кроме того, чтобы создать экземпляр объекта времени разработки в XAML (d - это специальное пространство имен конструктора)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>
Джесон Мартаджая
источник
Этот класс (Windows.ApplicationModel ) предназначен для приложений Магазина, включенных в API среды выполнения Windows. Это не готовое решение WPF, если вы просто работаете с обычным настольным приложением Windows.
qJake