¿Existe una propiedad DesignMode en WPF?

Respuestas:

152

De hecho hay :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Ejemplo:

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

public class MyUserControl : UserControl
{
    public MyUserControl()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            // Design-mode specific functionality
        }
    }
}
Enrico Campidoglio
fuente
Apliqué su solución en mi aplicación pero no funciona. Lo pregunté aquí stackoverflow.com/questions/3987439/… . Si lo desea, únase a nosotros y discuta.
Nam G VU
@serhio Gracias por señalar eso. ¿Conoce alguna solución? Por cierto, parece que tampoco funciona en Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837/…
Enrico Campidoglio
En VS2019, el interruptor Enable project codedebe estar habilitado (o Menú-> Diseño-> 🗹 Ejecutar código de proyecto).
marbel82
47

En algunos casos, necesito saber si el diseñador inicia una llamada a mi clase que no es de IU (como si creo una clase DataContext desde XAML). Entonces, el enfoque de este artículo de MSDN es útil:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}
Max Galkin
fuente
Apliqué su solución en mi aplicación pero no funciona. Lo pregunté aquí stackoverflow.com/questions/3987439/… . Si lo desea, únase a nosotros y discuta.
Nam G VU
20

Para cualquier control de WPF alojado en WinForms , DesignerProperties.GetIsInDesignMode(this)no funciona.

Entonces, creé un error en Microsoft Connect y agregué una solución alternativa:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}
serhio
fuente
¿No debería ser en GetEntryAssembly()lugar de GetExecutingAssembly()? Este último debería devolver el ensamblado donde se define esta propiedad
fjch1997
7

Respuesta tardía, lo sé, pero para cualquier otra persona que quiera usar esto en DataTrigger, o en cualquier lugar de XAML en general:

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>
Manfred Radlwimmer
fuente
0

Usa este:

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

(Las operaciones asincrónicas y de archivo no funcionarán aquí)

Además, para crear una instancia de un objeto en tiempo de diseño en XAML (d es el espacio de nombres del diseñador especial)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>
Jeson Martajaya
fuente
Esa clase ( Windows.ApplicationModel) es para aplicaciones de la Tienda, incluidas en la API de Windows Runtime. Esta no es una solución WPF lista para usar si solo está trabajando en una aplicación de escritorio de Windows normal.
qJake