¿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
        }
    }
}

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
}

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;
}

¿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>

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>

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.