Alguém sabe de alguma variável de estado global que está disponível para que eu possa verificar se o código está atualmente em execução no modo de design (por exemplo, no Blend ou Visual Studio) ou não?
Seria algo como isto:
//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode)
{
...
}
A razão pela qual eu preciso disso é: quando meu aplicativo estiver sendo mostrado no modo de design no Expression Blend, quero que o ViewModel use uma "classe Design Customer" que contenha dados simulados que o designer possa exibir no modo de design.
No entanto, quando o aplicativo está realmente em execução, é claro que desejo que o ViewModel use a classe Customer real, que retorna dados reais.
Atualmente, eu resolvo isso fazendo com que o designer, antes que ele trabalhe, vá para o ViewModel e altere "ApplicationDevelopmentMode.Executing" para "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);
}
}
}
fonte
Enable project code
deve estar ativado (ou Menu-> Design-> 🗹 Executar código do projeto).Você pode fazer algo assim:
fonte
internal class MyDependencyObject : DependencyObject {}
e utilizaçãonew MyDependencyObject
, em vez deDependencyObject
DependencyObject
o construtor épublic
.Funciona de qualquer lugar. Eu o uso para impedir que vídeos do banco de dados sejam reproduzidos no designer.
fonte
Application.Current.MainWindow == null
dito acima, embora eu goste mais do teste de tipo, mais direto. Também parece que o designer hospedado no Visual Studio adiciona recursos, então aqui está outra maneira de fazer isso (se você não tiver acesso aoApp
tipo específico na biblioteca que hospeda seu código)((bool)Application.Current.Resources["ExpressionUseLayoutRounding"])
. É necessário verificar se o recurso ainda não existe, mas funciona no contexto do designer.Quando o Visual Studio gerou automaticamente algum código para mim, ele foi usado
fonte
Existem outras maneiras (talvez mais recentes) de especificar dados em tempo de design no WPF, conforme mencionado nesta resposta relacionada .
Essencialmente, você pode especificar dados em tempo de design usando uma instância em tempo de design do seu ViewModel :
ou especificando dados de amostra em um arquivo XAML :
Você precisa definir as
SamplePage.xaml
propriedades do arquivo para:Coloco estes na minha
UserControl
tag, assim:No tempo de execução, todas as tags de tempo de design "d:" desaparecem; portanto, você só obtém seu contexto de dados em tempo de execução, mas escolhe defini-lo.
Editar Você também pode precisar dessas linhas (não tenho certeza, mas elas parecem relevantes):
fonte
E se você usa extensivamente o Caliburn.Micro para seu aplicativo WPF / Silverlight / WP8 / WinRT grande, também pode usar a propriedade estática do caliburn útil e universal
Execute.InDesignMode
em seus modelos de exibição (e funciona no Blend e no Visual Studio):fonte
Eu só testei isso com o Visual Studio 2013 e .NET 4.5, mas ele faz o truque.
É possível, no entanto, que alguma configuração no Visual Studio altere esse valor para false, se isso acontecer, podemos resultar apenas em verificar se esse nome de recurso existe. Foi
null
quando eu corri meu código fora do designer.A vantagem dessa abordagem é que ela não requer conhecimento explícito da
App
classe específica e que pode ser usada globalmente em todo o seu código. Especificamente para preencher modelos de exibição com dados fictícios.fonte
A resposta aceita não funcionou para mim (VS2019).
Depois de inspecionar o que estava acontecendo, eu vim com isso:
fonte
#if DEBUG
outro retorno false. Existe alguma razão para não fazer isso?Tenho uma ideia para você, se sua classe não precisar de um construtor vazio.
A ideia é criar um construtor vazio e marque-o com ObsoleteAttribute. O designer ignora o atributo obsoleto, mas o compilador gera um erro se você tentar usá-lo, portanto não há risco de usá-lo acidentalmente.
( perdoe meu visual básico )
E o xaml:
Isso não funcionará se você realmente precisar do construtor vazio para outra coisa.
fonte