¿Alguien sabe de alguna variable de estado global que esté disponible para que pueda verificar si el código se está ejecutando actualmente en modo de diseño (por ejemplo, en Blend o Visual Studio) o no?
Se vería algo así:
//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode)
{
...
}
La razón por la que necesito esto es: cuando mi aplicación se muestra en modo de diseño en Expression Blend, quiero que ViewModel utilice en su lugar una "Clase de diseño de cliente" que tiene datos simulados que el diseñador puede ver en modo de diseño.
Sin embargo, cuando la aplicación se está ejecutando, por supuesto, quiero que ViewModel use la clase de cliente real que devuelve datos reales.
Actualmente resuelvo esto haciendo que el diseñador, antes de trabajar en él, vaya al ViewModel y cambie "ApplicationDevelopmentMode.Executing" a "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);
}
}
}
fuente
Enable project code
debe estar habilitado (o Menú-> Diseño-> 🗹 Ejecutar código de proyecto).Puedes hacer algo como esto:
fuente
internal class MyDependencyObject : DependencyObject {}
y usar ennew MyDependencyObject
lugar deDependencyObject
DependencyObject
el constructor espublic
.Funciona desde cualquier lugar. Lo uso para evitar que los videos enlazados a datos se reproduzcan en el diseñador.
fuente
Application.Current.MainWindow == null
aunque me gusta más la prueba de tipo, más directa. También parece que el diseñador alojado en Visual Studio agrega recursos, así que aquí hay otra forma de hacerlo (si no tiene acceso alApp
tipo específico en la biblioteca que aloja su código)((bool)Application.Current.Resources["ExpressionUseLayoutRounding"])
. Sin embargo, es necesario verificar si el recurso no está allí, pero funciona en el contexto del diseñador.Cuando Visual Studio generó automáticamente un código para mí, lo usó
fuente
Hay otras formas (tal vez más nuevas) de especificar datos en tiempo de diseño en WPF, como se menciona en esta respuesta relacionada .
Esencialmente, puede especificar datos de tiempo de diseño utilizando una instancia de tiempo de diseño de su ViewModel :
o especificando datos de muestra en un archivo XAML :
Debe establecer las
SamplePage.xaml
propiedades del archivo en:Coloco estos en mi
UserControl
etiqueta, así:En tiempo de ejecución, todas las etiquetas de tiempo de diseño "d:" desaparecen, por lo que solo obtendrá su contexto de datos de tiempo de ejecución, sin embargo, si elige configurarlo.
Editar También puede necesitar estas líneas (no estoy seguro, pero parecen relevantes):
fuente
Y si usa ampliamente Caliburn.Micro para su gran aplicación WPF / Silverlight / WP8 / WinRT , también podría usar la propiedad estática de caliburn práctica y universal
Execute.InDesignMode
en sus modelos de vista (y funciona en Blend tan bien como en Visual Studio):fuente
Solo probé esto con Visual Studio 2013 y .NET 4.5, pero funciona.
Sin embargo, es posible que alguna configuración en Visual Studio cambie este valor a falso, si eso sucede, podemos simplemente verificar si este nombre de recurso existe. Era
null
cuando ejecuté mi código fuera del diseñador.La ventaja de este enfoque es que no requiere un conocimiento explícito de la
App
clase específica y que puede usarse globalmente en todo el código. Específicamente para llenar modelos de vista con datos ficticios.fuente
La respuesta aceptada no funcionó para mí (VS2019).
Después de inspeccionar lo que estaba pasando, se me ocurrió esto:
fuente
#if DEBUG
otra respuesta falso. ¿Hay alguna razón para no hacer eso?Tengo una idea para ti si tu clase no necesita un constructor vacío.
La idea es crear un constructor vacío, luego marcarlo con ObsoleteAttribute. El diseñador ignora el atributo obsoleto, pero el compilador generará un error si intenta usarlo, por lo que no hay riesgo de usarlo accidentalmente usted mismo.
( perdón mi visual básico )
Y el xaml:
Esto no funcionará si realmente necesita el constructor vacío para otra cosa.
fuente