2009-05-26 5 views
0

J'utilise la dernière version de Silverlight 2.0 dans Visual Studio 2008. Je simple UserControl Silverlight avec le code suivant:Actualiser Silverlight UserControl via XAML

public partial class SilverlightControl1 : UserControl 
{ 
    public SilverlightControl1() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(SilverlightControl1_Loaded); 
     Composite = new Composite(); 
    } 

    void SilverlightControl1_Loaded(object sender, RoutedEventArgs e) 
    { 
     Composite.Width = this.Width/2.0; 
     Composite.Height = this.Height/2.0; 
     if (!this.LayoutRoot.Children.Contains(Composite)) 
      this.LayoutRoot.Children.Add(Composite); 
    } 

    public Composite Composite 
    { 
     get; 
     set; 
    } 
} 

public class Composite : ContentControl 
{ 
    private Grid grid; 
    private Canvas canvas; 

    public Composite() 
    { 
     if (grid == null) grid = new Grid(); 
     if (canvas == null) canvas = new Canvas(); 
     if (!grid.Children.Contains(canvas)) 
      grid.Children.Add(canvas); 
     Content = grid; 
     this.Loaded += new RoutedEventHandler(Composite_Loaded); 
    } 

    private Rectangle rectangle; 

    void Composite_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (rectangle == null) rectangle = new Rectangle(); 
     Canvas.SetTop(rectangle, 0); 
     Canvas.SetLeft(rectangle, 0); 
     rectangle.Fill = new SolidColorBrush(Color); 
     rectangle.Width = Width; 
     rectangle.Height = Height; 
     if (!canvas.Children.Contains(rectangle)) 
      canvas.Children.Add(rectangle); 
    } 

    public Color Color 
    { 
     get; 
     set; 
    } 
} 

J'utilise ensuite ce UserControl dans une application Silverlight , le XAML de la page qui ressemble à ceci:

<UserControl x:Class="SilverlightApplication1.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:test="clr-namespace:SilverlightClassLibrary1;assembly=SilverlightClassLibrary1" 
    Width="400" Height="300"> 
    <Grid x:Name="LayoutRoot" Background="Green"> 
    <test:SilverlightControl1 Name="uControl1"> 
     <test:SilverlightControl1.Composite> 
     <test:Composite Color="Yellow"/> 
     </test:SilverlightControl1.Composite> 
    </test:SilverlightControl1> 
    </Grid> 
</UserControl> 

Ma question est la suivante: quel code dois-je ajouter à ce qui précède afin qu'en changeant « Couleur composite » à quelque chose d'autre que le jaune et en appuyant sur le bouton de retour, UserControl est actualisé automatiquement? Comme le code l'indique, la seule façon d'actualiser UserControl est de déplacer la barre Slider dans l'EDI VS2008, ce qui modifie le pourcentage de zoom de la page Silverlight. Une question secondaire, bien que de moindre importance à la question ci-dessus, est: avec le code tel qu'il est ci-dessus, pourquoi ne puis-je pas changer la couleur "Background" de LayoutRoot? Si je supprime mon UserControl, cela fonctionne comme prévu.

Répondre

1

La solution était double. Tout d'abord, apporter des modifications dans l'événement LayoutUpdated plutôt que dans l'événement Loaded et deuxièmement, vous abonner au PropertyChangedCallback de PropertyMetadata. Voici le code de travail complet:

public partial class SilverlightControl1 : UserControl 
    { 
    public SilverlightControl1() 
    { 
     InitializeComponent(); 
     this.LayoutUpdated += new EventHandler(SilverlightControl1_LayoutUpdated); 
     Composite = new Composite(); 
    } 

    void SilverlightControl1_LayoutUpdated(object sender, EventArgs e) 
    { 
     Composite.Width = this.Width/2.0; 
     Composite.Height = this.Height/2.0; 
     if (!this.LayoutRoot.Children.Contains(Composite)) this.LayoutRoot.Children.Add(Composite); 
    } 

    public Composite Composite 
    { 
     get; 
     set; 
    } 
    } 

    public class Composite : ContentControl 
    { 
    private Grid grid; 
    private Canvas canvas; 

    public Composite() 
    { 
     if (grid == null) grid = new Grid(); 
     if (canvas == null) canvas = new Canvas(); 
     if (!grid.Children.Contains(canvas)) grid.Children.Add(canvas); 
     Content = grid; 
     this.LayoutUpdated += new EventHandler(Composite_LayoutUpdated); 
    } 

    void Composite_LayoutUpdated(object sender, EventArgs e) 
    { 
     if (rectangle == null) rectangle = new Rectangle(); 
     Canvas.SetTop(rectangle, 0); 
     Canvas.SetLeft(rectangle, 0); 
     rectangle.Fill = new SolidColorBrush(Color); 

     rectangle.Width = Width; 
     rectangle.Height = Height; 
     if (!canvas.Children.Contains(rectangle)) canvas.Children.Add(rectangle); 
    } 

    public static readonly DependencyProperty ColorProperty = DependencyProperty.Register("Color", typeof(Color), typeof(Composite), new PropertyMetadata(Colors.Red, new PropertyChangedCallback(OnColorPropertyChanged))); 

    private static void OnColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Composite comp = (Composite)d; 
     comp.InvalidateArrange(); 
    } 

    private Rectangle rectangle; 

    public Color Color 
    { 
     get { return (Color)GetValue(ColorProperty); } 
     set { SetValue(ColorProperty, value); } 
    } 
    } 
0

Je pense que vous devez faire de composite dans une propriété de dépendance. Probablement voudra faire la même chose pour Color on Composite afin que vous puissiez le lier.

+0

Merci pour la réponse, Correl! J'ai implémenté les propriétés Composite et Color en tant que propriétés Dependency, comme vous l'avez suggéré, mais cela n'a malheureusement pas changé le problème! –

+0

En regardant le code, je pense que le problème ici est que vous définissez la couleur dans les événements OnLoaded. Lorsque vous modifiez la couleur, vous ne forcez pas VS à recharger le contrôle, de sorte que l'événement n'est pas renvoyé. Au lieu de définir le remplissage du rectangle sur la valeur de couleur, essayez plutôt de le lier. De cette façon, lorsque la couleur change, la propriété Dépendance se déclenche et la met à jour. –

+0

Merci Correl! J'ai la propriété Color implémentée en tant que propriété Dependency à l'aide de DependencyObject.GetValue et SetValue. Lorsque je définis le remplissage du rectangle, la propriété Color est donc déjà liée à la propriété de dépendance, non? –

Questions connexes