2012-01-31 19 views
16

En WPF XAML no es el conveniente DesignHeight y DesignWidth, por ejemplo en código como¿Color de fondo de solo tiempo de diseño en WPF?

<UserControl ... d:DesignHeight="500" d:DesignWidth="500" ... /> 

que es grande porque puedo construir el diseño con un representante , pero que no esté bloqueado en, el tamaño de control .

Sin embargo, a menudo construyo UI oscuras, donde las etiquetas y demás deben ser blancos, pero mis controles aún necesitan un color de fondo transparente. Esto crea un inconveniente en el tiempo de diseño porque el blanco parece ser el color de fondo predeterminado para los controles transparentes en el diseñador, lo que genera etiquetas ilegibles de blanco sobre blanco.

¿Hay alguna manera o estrategia para establecer el color de fondo en tiempo de diseño, con la misma conveniencia que DesignHeight/DesignWidth?

+0

No estoy seguro, buscando en Google Encontré dos documentos [aquí] (http://msdn.microsoft.co) m/en-us/library/ee839627 (VS.100) .aspx) y [aquí] (http://msdn.microsoft.com/en-us/library/ff602277 (v = vs.95) .aspx). Puede ser que serán útiles – Oybek

+2

Vea también: http://stackoverflow.com/questions/5183801/black-background-for-xaml-editor – ColinE

+0

Posible duplicado de [XAML: ¿Cómo cambiar el color de fondo solo en modo Diseño?] (https://stackoverflow.com/questions/4843276/xaml-how-to-change-background-color-only-in-design-mode) –

Respuesta

8

Mi respuesta fue encontrada aquí: Black Background for XAML Editor. Hay una serie de opciones, incluida la comprobación System.ComponentModel.DesignerProperties.GetIsInDesignMode(this) en tiempo de ejecución.

9

Encontré que puedes hacer una para ti. Custom design-time attributes in Silverlight and WPF designer es un tutorial sobre cómo hacerlo tanto para Silverlight como para WPF.

+1

Este es un poco más agradable para mí que la respuesta aceptada, gracias. – Sevenate

+1

Esta debería ser la respuesta aceptada, ya que es mucho más modular y se puede usar directamente en el diseñador sin escribir código para controles múltiples. – McLovin

8

Hay una propiedad no documentada d:DesignStyle de tipo Style que puede establecer en un control de usuario. Este estilo solo se aplica en el diseñador y no se usa en tiempo de ejecución.

que lo utilice como esto:

<UserControl ... d:DesignStyle="{StaticResource MyDesignStyle}" /> 

O así:

<UserControl ...> 
    <d:DesignerProperties.DesignStyle> 
     <Style TargetType="UserControl">...</Style> 
    </d:DesignerProperties.DesignStyle> 
</UserControl> 

Nota sin embargo que cualquier valor establecido en el Style propiedad (el que se utiliza en tiempo de ejecución) también anular el DesignStyle en el diseñador

+0

Esto es realmente agradable y mucho más fácil que las otras respuestas. – gartenriese

+0

¿Qué es un estilo de diseño y cómo inicializarlo? Para facilitar esto, ¿cómo configura 'd: DesignStyle' en Blanco? –

0

La técnica d:DesignerProperties.DesignStyle ve en este funciona muy bien para la aplicación de un tiempo de diseño de solo estilo WPF a un solo control , pero no parece trabajar para una Style en un ResourceDictionary que se aplicaría a todos de los controles o elementos apropiadamente tipados bajo el alcance del diccionario. A continuación se muestra una solución simple que encontré para implementar un estilo exclusivo de diseñador en un ResourceDictionary.

Considérese, por ejemplo, un Window contiene un TreeView, donde queremos que los TreeViewItem nodos para mostrar como se hayan expandido completamente, pero sólo en tiempo de diseño. Primero, coloque el estilo deseado en el diccionario XAML de la forma habitual.

<Window.Resources> 
    <Style TargetType="TreeViewItem"> 
     <Setter Property="IsExpanded" Value="True" /> 
    </Style> 
</Window.Resources> 

Aquí, el Style se pone en el ResourceDictionary del Window pero por supuesto que podría utilizar cualquier otro diccionario subsumir en su lugar. A continuación, en el código de C#, , elimine el estilo del Resource­Dict­ionary cuando el modo de diseño es no detectado.Para ello, se encuentra en la OnInitialized anulación:

protected override void OnInitialized(EventArgs e) 
{ 
    if (DesignerProperties.GetIsInDesignMode(this) == false) 
     Resources.Remove(typeof(TreeViewItem)); 

    base.OnInitialized(e); 
} 

modo de diseño:                                                         Modo Tiempo de ejecución:

design mode     runtime mode

0

Ésta es la solución completa para DesignBackground:

public class DesignTimeProperties : DependencyObject 
    { 
     private static readonly Type OwnerType = typeof(DesignTimeProperties); 

     #region DesignBackground (attached property) 

     public static Brush GetDesignBackground(DependencyObject obj) 
     { 
      return (Brush)obj.GetValue(DesignBackgroundProperty); 
     } 

     public static void SetDesignBackground(DependencyObject obj, Brush value) 
     { 
      obj.SetValue(DesignBackgroundProperty, value); 
     } 

     public static readonly DependencyProperty DesignBackgroundProperty = 
      DependencyProperty.RegisterAttached(
       "DesignBackground", 
       typeof (Brush), 
       OwnerType, 
       new FrameworkPropertyMetadata(Brushes.Transparent, 
        DesignBackgroundChangedCallback)); 

     public static void DesignBackgroundChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      if (IsInDesignMode) 
      { 
       var control = d as Control; 
       var brush = e.NewValue as Brush; 
       if (control != null && brush != null) 
       { 
        control.Background = brush; 
       } 
      } 
     } 

     public static bool IsInDesignMode 
     { 
      get 
      { 
       return 
        ((bool) 
         DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof (DependencyObject)).DefaultValue); 
      } 
     } 

     #endregion 

    } 

Uso:

<UserControl ... infra:DesignTimeProperties.DesignBackground="Black" />