Кто-нибудь знает какую-нибудь глобальную переменную состояния, которая доступна, чтобы я мог проверить, выполняется ли код в данный момент в режиме разработки (например, в Blend или Visual Studio) или нет?
Это будет выглядеть примерно так:
//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode)
{
...
}
Причина, по которой мне это нужно, заключается в том, что когда мое приложение отображается в режиме разработки в Expression Blend, я хочу, чтобы ViewModel вместо этого использовал «класс Design Designer», в котором есть фиктивные данные, которые дизайнер может просматривать в режиме конструктора.
Однако, когда приложение фактически выполняется, я, конечно, хочу, чтобы ViewModel использовал реальный класс Customer, который возвращает реальные данные.
В настоящее время я решаю эту проблему с помощью конструктора, прежде чем он работает над ним, перейдите в ViewModel и измените «ApplicationDevelopmentMode.Executing» на «ApplicationDevelopmentMode.Designing»:
public CustomersViewModel()
{
_currentApplicationDevelopmentMode = ApplicationDevelopmentMode.Designing;
}
public ObservableCollection<Customer> GetAll
{
get
{
try
{
if (_currentApplicationDevelopmentMode == ApplicationDevelopmentMode.Developing)
{
return Customer.GetAll;
}
else
{
return CustomerDesign.GetAll;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
источник
Enable project code
должен быть включен (или Menu-> Design-> 🗹 Run Project Code).Вы можете сделать что-то вроде этого:
источник
internal class MyDependencyObject : DependencyObject {}
и используйтеnew MyDependencyObject
вместо негоDependencyObject
DependencyObject
конструкторpublic
.Работает откуда угодно. Я использую его, чтобы остановить воспроизведение видео с привязкой к данным в дизайнере.
источник
Application.Current.MainWindow == null
хотя мне больше нравится типовой тест, более прямой. Также кажется, что дизайнер, размещенный в Visual Studio, добавляет ресурсы, так что вот еще один способ сделать это (если у вас нет доступа к определенномуApp
типу в библиотеке, содержащей ваш код)((bool)Application.Current.Resources["ExpressionUseLayoutRounding"])
. Нужно проверить, если ресурса нет, хотя он работает в контексте дизайнера.Когда Visual Studio автоматически генерировал какой-то код для меня, он использовал
источник
Есть другие (возможно, более новые) способы указания данных времени разработки в WPF, как упомянуто в этом связанном ответе .
По сути, вы можете указать данные времени разработки, используя экземпляр времени разработки вашей ViewModel :
или указав пример данных в файле XAML :
Вы должны установить
SamplePage.xaml
свойства файла:Я помещаю их в свой
UserControl
тег, вот так:Во время выполнения все теги времени разработки "d:" исчезают, поэтому вы получите только контекст данных времени выполнения, однако вы решите его установить.
Редактировать Вам также могут понадобиться эти строки (я не уверен, но они кажутся актуальными):
источник
И если вы широко используете Caliburn.Micro для своего большого приложения WPF / Silverlight / WP8 / WinRT, вы также можете использовать удобное и универсальное
Execute.InDesignMode
статическое свойство caliburn в своих моделях представления (и оно работает в Blend так же хорошо, как в Visual Studio):источник
Я тестировал это только с Visual Studio 2013 и .NET 4.5, но это помогает.
Возможно, однако, что некоторые настройки в Visual Studio изменят это значение на false, если это когда-либо произойдет, мы можем просто проверить, существует ли это имя ресурса. Это было,
null
когда я запускал свой код за пределами дизайнера.Преимущество этого подхода в том, что он не требует явных знаний о конкретном
App
классе и что он может использоваться глобально во всем вашем коде. Специально для заполнения моделей представления фиктивными данными.источник
Принятый ответ не работал для меня (VS2019).
Изучив, что происходит, я пришел к следующему:
источник
#if DEBUG
возвращаемое значение false. Есть ли причина не делать этого?У меня есть идея, если вашему классу не нужен пустой конструктор.
Идея состоит в том, чтобы создать пустой конструктор, а затем пометить его ObsoleteAttribute. Дизайнер игнорирует устаревший атрибут, но компилятор выдаст ошибку, если вы попытаетесь его использовать, поэтому нет риска случайного использования его самостоятельно.
( простите мой визуальный основы )
И XAML:
Это не сработает, если вам действительно нужен пустой конструктор для чего-то другого.
источник