2009-05-26 17 views
0

を経由して、私は次のコードでシンプルなシルバーのUserControlを持っているのVisual Studio 2008内のSilverlight 2.0の最新のバージョンを使用しています、ページのXAMLは、このように見える:更新Silverlightのユーザーコントロールは、XAML

<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> 

私の質問です:私は上記に追加する必要がありますどのようなコードので、イエロー以外のものに「合成カラー」を変更し、戻るボタンを押すことで、 UserControlは自動的に更新されますか?コードがあるように、UserControlを更新する唯一の方法は、Silverlightページのパーセンテージズームを変更するVS2008 IDE内のスライダバーを移動することです。上の質問にはそれほど重要ではありませんが、上のコードでは、なぜLayoutRootの「背景」の色を変更できないのですか? UserControlを削除すると、期待どおりに機能します。

答えて

1

溶液は2倍であった。まず、LoadedイベントではなくLayoutUpdatedイベントを変更し、次にPropertyMetadataのPropertyChangedCallbackに登録するようにします。ここに完全なコードがあります:

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

私はあなたがCompositeをDependency Propretyにする必要があると思います。 Color on Compositeで同じことをして、バインドできるようにしたいと思うでしょう。

+0

回答ありがとうございました。あなたが示唆したように、私はCompositeプロパティとColorプロパティをDependencyプロパティとして実装しましたが、残念ながらこれは問題に何の違いも生じませんでした! –

+0

コードを見ると、OnLoadedイベントの色を設定していることが問題だと思います。色を変更しているときに、VSがコントロールをリロードしないようにして、イベントが再び発生しないようにします。 Rectangleの塗りつぶしをColorの値に設定する代わりに、代わりにバインドしてみてください。 Colorが変わると、Dependencyプロパティが起動し、それを更新します。 –

+0

ありがとうCorrel! DependencyObject.GetValueとSetValueを使用して、DependencyプロパティとしてColorプロパティを実装しました。 Rectangleの塗りつぶしを設定すると、Colorプロパティは既に従属プロパティにバインドされていますか? –

関連する問題