Чи є властивість DesignMode у WPF?


Відповіді:


152

Дійсно є :

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/… . Якщо ви хочете, будь ласка, приєднайтесь до нас та обговоріть.
Нам Г ВУ

@serhio Дякую, що вказали на це. Чи знаєте ви про якісь рішення? До речі, здається, що він також не працює в Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837/…
Enrico Campidoglio

У VS2019 перемикач Enable project codeповинен бути включений (або Меню-> Дизайн-> 🗹 Запустити проектний код).
marbel82

47

У деяких випадках мені потрібно знати, чи ініціює дизайнер ініціювання виклику до мого класу, що не є користувальницьким інтерфейсом (наприклад, якщо я створюю клас XMLL DataContext). Тоді корисний підхід з цієї статті MSDN :

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}

Я застосував ваше рішення у своїй програмі, але воно не працює. Я запитав це тут stackoverflow.com/questions/3987439/… . Якщо ви хочете, будь ласка, приєднайтесь до нас та обговоріть.
Нам Г ВУ

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.