2017-03-17 2 views
2

J'ai quelques polygones sur UserControl que je veux la couleur:Comment puis-je voir la valeur DependencyProperty par défaut dans le temps de conception lorsque j'utilise la liaison

<LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5"> 
    <GradientStop Color="{Binding Color}" Offset="0"/> 
    <GradientStop Color="{Binding SecondaryColor}" Offset="0.5"/> 
    <GradientStop Color="{Binding Color}" Offset="1"/> 
</LinearGradientBrush> 

Ceci est mon DataContext:

<DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

et ceci est ma propriété de dépendance avec une valeur par défaut définie dans PropertyMetadata:

[Category("Silo - appearance")] 
public Color Color 
{ 
    get { return (Color)GetValue(ColorProperty); } 
    set { SetValue(ColorProperty, value); } 
} 
public static readonly DependencyProperty ColorProperty = 
    DependencyProperty.Register("Color", typeof(Color), typeof(Silo), 
     new PropertyMetadata((Color)Color.FromArgb(255,0x27, 0x77, 0x9E))); 

mon Polygon où je mets ce LinearGradientBrush est transparent en UserControl temps de conception.

J'ai essayé de reconstruire la solution, mais il n'y a pas de différence.

  1. Pourquoi ma valeur par défaut n'est pas appliquée au moment du design?

  2. Que puis-je faire pour voir (dans le temps de conception) couleur par défaut définie dans PropertyMetadata?

+0

La seule façon que je connaisse est mis propriétés de dépendance La classe de base hérite alors de votre contrôle de cette classe de base. Ensuite, il travaillera dans le concepteur. Malheureusement, je ne comprends pas pourquoi. – Evk

+0

Je pense que la façon dont (et quand) la liaison est évaluée joue un grand rôle dans cela ... – Kamil

+0

Est-ce que ça marche aussi pour vous si vous mettez des propriétés dans la classe parente? – Evk

Répondre

3

Une façon que je sais de résoudre ce n'est pas très agréable, mais semble fonctionner. Vous pouvez déplacer vos propriétés de dépendance vers la classe parent et hériter de votre contrôle utilisateur de cette classe. Par exemple:

public class Parent : UserControl 
{ 
    [Category("Silo - appearance")] 
    public Color Color 
    { 
     get { return (Color)GetValue(ColorProperty); } 
     set { SetValue(ColorProperty, value); } 
    } 
    public static readonly DependencyProperty ColorProperty = 
     DependencyProperty.Register("Color", typeof(Color), typeof(Parent), 
      new PropertyMetadata((Color)Color.FromArgb(255, 0x1A, 0x17, 0xA))); 

    public Color SecondaryColor 
    { 
     get { return (Color)GetValue(SecondaryColorProperty); } 
     set { SetValue(SecondaryColorProperty, value); } 
    } 

    public static readonly DependencyProperty SecondaryColorProperty = 
     DependencyProperty.Register("SecondaryColor", typeof(Color), typeof(Parent), new PropertyMetadata(Color.FromArgb(255, 0x47, 0x17, 0x9E))); 
} 

public partial class UserControl1 : Parent 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    }  
} 

Et puis en XAML:

<local:Parent x:Class="WpfApplication1.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfApplication1" 
      mc:Ignorable="d" 
      d:DesignHeight="300" 
      d:DesignWidth="300" 
       DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <Rectangle Height="300" Width="300"> 
     <Rectangle.Fill> 
      <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5"> 
       <GradientStop Color="{Binding Color}" Offset="0"/> 
       <GradientStop Color="{Binding SecondaryColor}" Offset="0.5"/> 
       <GradientStop Color="{Binding Color}" Offset="1"/> 
      </LinearGradientBrush> 
     </Rectangle.Fill> 
    </Rectangle> 
</local:Parent> 

Je ne suis pas tout à fait certain pourquoi cela fonctionne, mais je pense: WPF concepteur ne fonctionne pas de code dans votre contrôle du tout. Il est déjà connu qu'il n'exécutera pas le constructeur de votre UserControl1, et il semble qu'il n'exécutera pas d'autre code là aussi (comme les initialiseurs de champs statiques pour votre propriété de dépendance). Cependant, il instanciera la classe parente comme le montre cet exemple. Probablement, il crée dynamiquement un nouveau contrôle sans code supplémentaire et l'hérite de la classe héritée de votre contrôle. Comment fonctionne exactement le concepteur WPF n'est pas bien documenté (si du tout), donc nous pouvons seulement deviner.

Alternative (et je pense mieux) approche sera utiliser tout contexte de données temps de conception:

public class UserControlDesignContext { 
    public Color Color { get; set; } = Color.FromArgb(255, 0x11, 0x17, 0xA); 
    public Color SecondaryColor { get; set; } = Color.FromArgb(255, 0x47, 0x17, 0x9E); 
} 

Et puis en XAML:

<UserControl x:Class="WpfApplication1.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfApplication1" 
      mc:Ignorable="d" 
      d:DesignHeight="300" 
      d:DesignWidth="300" 
       d:DataContext="{d:DesignInstance local:UserControlDesignContext, IsDesignTimeCreatable=True}" 
       DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <Rectangle Height="300" Width="300"> 
     <Rectangle.Fill> 
      <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5"> 
       <GradientStop Color="{Binding Color}" Offset="0"/> 
       <GradientStop Color="{Binding SecondaryColor}" Offset="0.5"/> 
       <GradientStop Color="{Binding Color}" Offset="1"/> 
      </LinearGradientBrush> 
     </Rectangle.Fill> 
    </Rectangle> 
</UserControl>