2009-07-08 7 views
1

Mon problème est certainement raison sur mon visage, mais je ne peux pas le voir ...WPF - Reliure dans un langage simple contrôle de l'utilisateur

Je construis un contrôle utilisateur très simple - une ellipse 3D - et j'expose deux propriétés : LightColor et DarkColor. J'ai besoin de lier ces propriétés au dégradé dans mon contrôle utilisateur, mais il ne montre aucune couleur du tout. Voici mon usercontrol:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:TestBrushes" 
mc:Ignorable="d" 
x:Class="TestBrushes._3DEllipse" 
x:Name="UserControl" 
d:DesignWidth="200" d:DesignHeight="200"> 
    <Grid x:Name="LayoutRoot"> 
     <Ellipse Name="MainEllipse" Stroke="{x:Null}"> 
      <Ellipse.Fill> 
       <RadialGradientBrush GradientOrigin="0.5,1.1"> 
        <GradientStop Color="{Binding ElementName=UserControl, Path=LightColor}" Offset="1"/> 
        <GradientStop Color="{Binding ElementName=UserControl, Path=DarkColor}" Offset="0"/> 
       </RadialGradientBrush> 
      </Ellipse.Fill> 
     </Ellipse> 
     <Ellipse Name="TopReflectionEllipse" Stroke="{x:Null}" Margin="38,0,38,0" VerticalAlignment="Top" Height="90"> 
      <Ellipse.Fill> 
       <RadialGradientBrush GradientOrigin="0.5,0"> 
        <RadialGradientBrush.RelativeTransform> 
         <TransformGroup> 
          <ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1" ScaleY="1"/> 
          <SkewTransform AngleX="0" AngleY="0" CenterX="0.5" CenterY="0.5"/> 
          <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5"/> 
          <TranslateTransform X="0" Y="0"/> 
         </TransformGroup> 
        </RadialGradientBrush.RelativeTransform> 
        <GradientStop Color="#A5FFFFFF" Offset="0"/> 
        <GradientStop Color="#00FFFFFF" Offset="1"/> 
       </RadialGradientBrush> 
      </Ellipse.Fill> 
     </Ellipse> 
    </Grid> 
</UserControl> 

et voici mon code-behind:

public partial class _3DEllipse 
{ 
    public _3DEllipse() 
    { 
     InitializeComponent(); 
    } 

    public Color DarkColor { get; set; } 
    public Color LightColor { get; set; } 
} 

Si j'attribuer des couleurs par rapport à la liaison figurant dans le code, il fonctionne bien, mais je veux utiliser les propriétés Je suis exposant. Qu'est-ce que je fais mal?

Merci!

Répondre

3

Votre problème est probablement que vous ne notifiez pas UserControl des modifications apportées à la valeur des propriétés DarkColor et LightColor. Pour ce faire, vous devez implémenter l'interface INotifyPropertyChanged. Le but de cette interface est de rendre les composants de l'interface utilisateur conscients du moment où la valeur à laquelle ils sont liés est mise à jour. ils s'abonnent à l'événement PropertyChanged qui est exposé en implémentant l'interface.

Un exemple d'implémentation est ci-dessous, j'ai laissé la propriété DarkColor seule, mais elle serait mise à jour de la même manière.

public partial class _3DEllipse : INotifyPropertyChanged 
{ 

    private Color _lightColor; 


    public _3DEllipse() 
    { 
     InitializeComponent(); 
    } 

    // interface implementation 
    public event PropertyChangedEventHandler PropertyChanged; 

    public Color DarkColor { get; set; } 
    public Color LightColor 
    { 
     get { return _lightColor; } 
     set 
     { 
      // only update value if its changed 
      if (_lightColor == value) 
      { 
       return; 
      } 

      _lightColor = value; 
      OnPropertyChanged("LightColor"); 
     } 
    } 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged == null) return; 

     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

Oui, vous avez raison. Je savais qu'il regardait mon visage. Merci!!! –

+0

Je viens d'utiliser une propriété de dépendance et tout a bien fonctionné. –

+0

L'utilisation de DependencyProperty fonctionne correctement, mais vous devez implémenter INotifyPropertyChanged. – rix0rrr

Questions connexes