2009-01-08 13 views
92

En Winforms se puede decir¿Hay una propiedad DesignMode en WPF?

if (DesignMode) 
{ 
    // Do something that only happens on Design mode 
} 

es que hay algo como esto en WPF?

+1

Tenga en cuenta que GetIsInDesignMode sufre de [la misma enorme fallo ya que la propiedad DesignMode ] (http://stackoverflow.com/questions/34664/designmode-with-controls) –

Respuesta

139

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 
     } 
    } 
} 
+0

Apliqué la solución en mi aplicación pero no funciona. Lo pregunté aquí http://stackoverflow.com/questions/3987439/init-grid-row-height-doesnt-work. Si lo hiciera, únase a nosotros y discútalo. –

+3

este código no funciona si el WPF está alojado en un WinForm. – serhio

+0

@serhio Gracias por señalar eso. ¿Conoce alguna solución? Por cierto, parece que tampoco funciona en Silverlight: http://connect.microsoft.com/VisualStudio/feedback/details/371837/designerproperties-getisindesignmode-doesnt-work-with-silverlight-pages –

45

En algunos casos que necesito saber, si una llamada a mi clase no interfaz de usuario es iniciado por el diseñador (como si creara una clase DataContext de XAML). A continuación, el enfoque es útil from this MSDN article:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{ 
    //in Design mode 
} 
+0

Apliqué su solución en mi aplicación pero no funciona. Lo pregunté aquí http://stackoverflow.com/questions/3987439/init-grid-row-height-doesnt-work. Si lo hiciera, únase a nosotros y discútalo. –

19

Para cualquier WPF Controls alojada en WinForms, DesignerProperties.GetIsInDesignMode(this) no funciona.

tanto, he creado a bug in Microsoft Connect y añadió una solución:

public static bool IsInDesignMode() 
{ 
    if (System.Reflection.Assembly.GetExecutingAssembly().Location.Contains("VisualStudio")) 
    { 
     return true; 
    } 
    return false; 
} 
+0

¿No debería ser 'GetEntryAssembly()' en lugar de 'GetExecutingAssembly()'? Este último debería devolver el ensamblado donde se define esta propiedad. – fjch1997

-1

Uso ésta:

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

(operaciones asíncronas y archivos no trabajará aquí)

Además, a instancias de un objeto de tiempo de diseño en XAML (d es el espacio de nombres de diseñador especial)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}"> 
... 
</Grid> 
+0

Esa clase ('Windows.ApplicationModel') es para aplicaciones de la Tienda, incluidas en la API de Windows Runtime. Esta no es una solución lista para usar de WPF si solo está trabajando en una aplicación de escritorio de Windows normal. – qJake

3

respuesta tardía, lo sé - pero para cualquier persona que quiera utilizar esto en un DataTrigger, o en cualquier lugar en 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> 
Cuestiones relacionadas