wpf visual-studio-2010 designer

¿Color de fondo solo en tiempo de diseño en WPF?



visual-studio-2010 designer (5)

En WPF XAML existe el conveniente DesignHeight y DesignWidth , por ejemplo, en código como

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

lo cual es genial porque puedo crear el diseño con un tamaño de control representativo , pero no bloqueado .

Sin embargo, a menudo estoy creando interfaces de usuario oscuras, donde las etiquetas y demás deben ser blancas, 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 lleva a etiquetas ilegibles de blanco sobre blanco.

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



Esta 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" />


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 el tiempo de ejecución.

Lo usas así:

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

O así:

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

Sin embargo, tenga en cuenta que cualquier valor establecido en la propiedad de Style (el que se usa en el tiempo de ejecución) también anulará el DesignStyle en el diseñador.


La técnica d:DesignerProperties.DesignStyle que se muestra en esta página funciona muy bien para aplicar un estilo de tiempo de diseño de WPF a un solo control , pero no parece funcionar para un Style en un ResourceDictionary que se aplique a todos los -trabajo controles o elementos 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 .

Considere, por ejemplo, una Window contiene un TreeView , donde queremos que los nodos TreeViewItem muestren totalmente expandidos, pero solo en el momento del diseño. Primero, ponga el estilo deseado en el diccionario XAML de la manera normal.

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

Aquí, el Style se coloca en el diccionario de ResourceDictionary de la Window pero, por supuesto, puede usar cualquier otro diccionario de subsuming. A continuación, en el código C #, elimine el estilo del ResourceDictionary cuando no se detecte el modo de diseño . Haga esto en la anulación OnInitialized :

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

Modo de diseño: Modo de tiempo de ejecución:


Mi respuesta se encontró aquí: Fondo negro para el editor XAML . Hay una serie de opciones que incluyen la comprobación de System.ComponentModel.DesignerProperties.GetIsInDesignMode(this) en el tiempo de ejecución.