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?

22
demandé sur DuckMaestro 2012-01-31 12:21:03

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.

17
répondu Sebastien Pellizzari 2016-11-29 13:18:08

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.

9
répondu Oybek 2016-07-22 15:22:25

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.

8
répondu DuckMaestro 2017-05-23 12:00:13

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 Resource­Dict­ionary 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:

design mode runtime mode

0
répondu Glenn Slayden 2017-12-07 21:55:59

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" />
0
répondu Tal Segal 2018-02-01 07:32:06