Couleur de fond Design-time-only dans WPF?
dans WPF XAML il y a le pratique DesignHeight
et DesignWidth
, par exemple dans le code comme
<UserControl ... d:DesignHeight="500" d:DesignWidth="500" ... />
ce qui est génial parce que je peux construire le layout avec un représentant , mais Non Verrouillé , taille de contrôle.
cependant, je construis souvent UIS sombre, où les étiquettes et ainsi de suite Besoin d'être blanc, mais mes commandes ont encore besoin d'une couleur de fond transparente. Cela crée un moment de la conception inconvénient parce que le blanc semble être la couleur de fond par défaut pour les contrôles transparents dans le concepteur, conduisant à des étiquettes blanches illisibles.
Existe-t-il un moyen ou une stratégie pour définir la couleur de fond design-time, avec la même commodité que DesignHeight/DesignWidth?
5 réponses
il y a une propriété non documentée d:DesignStyle
de type Style
que vous pouvez configurer sur un contrôle utilisateur. Ce style n'est appliqué que dans le designer et n'est pas utilisé à l'exécution.
vous l'utilisez comme ceci:
<UserControl ... d:DesignStyle="{StaticResource MyDesignStyle}" />
ou comme ceci:
<UserControl ...>
<d:DesignerProperties.DesignStyle>
<Style TargetType="UserControl">...</Style>
</d:DesignerProperties.DesignStyle>
</UserControl>
notez cependant que toute valeur définie sur la propriété Style
(celle utilisée lors de l'exécution) supplantera également la valeur DesignStyle
dans le concepteur.
j'ai trouvé que vous pouvez faire par vous-même. Personnaliser les attributs de conception dans Silverlight et WPF designer est un tutoriel de comment faire pour Silverlight et WPF.
Ma réponse a été trouvée ici: Fond Noir de l'Éditeur XAML . Il y a un certain nombre de choix, y compris la vérification System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)
à l'exécution.
la technique d:DesignerProperties.DesignStyle
montrée sur cette page fonctionne très bien pour appliquer un WPF design-time-only style à un single control , mais il ne semble pas fonctionner pour un Style
dans un ResourceDictionary
qui s'appliquerait à "15190920" tout des contrôles ou des éléments dactylographiés de manière appropriée dans le champ d'application du dictionnaire. Ci-dessous se trouve la solution simple que j'ai trouvé pour déployer un style uniquement designer dans un ResourceDictionary
.
considérons par exemple un Window
contenant un TreeView
, où nous voulons que les noeuds TreeViewItem
montrent une extension complète-mais seulement au moment de la conception. Tout d'abord, mettez le style désiré dans le dictionnaire XAML de la manière normale.
<Window.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
</Window.Resources>
ici, le Style
est mis dans le ResourceDictionary
du Window
mais bien sûr vous pouvez utiliser n'importe quel autre dictionnaire subsumant à la place. Ensuite, dans le code C#, supprimer le style de le ResourceDictionary
lorsque le mode de conception est et non détecté . Cela est dans le OnInitialized
remplacer:
protected override void OnInitialized(EventArgs e)
{
if (DesignerProperties.GetIsInDesignMode(this) == false)
Resources.Remove(typeof(TreeViewItem));
base.OnInitialized(e);
}
Mode De Conception: Mode D'Exécution:
C'est la solution complète pour 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
}
Utilisation:
<UserControl ... infra:DesignTimeProperties.DesignBackground="Black" />