2009-05-26 3 views
0

Я использую самую последнюю версию Silverlight 2.0 в Visual Studio 2008. У меня есть простой Silverlight UserControl со следующим кодом:Обновить Silverlight UserControl через 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; 
    } 
} 

я затем использовать этот UserControl в 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> 

Мой вопрос: какой код я должен добавить к вышесказанному, так что путем изменения «Composite Color» на что-то другое, чем желтый и нажав кнопку возврата, автоматически обновляется UserControl? Как код, единственный способ обновить UserControl - это перемещение панели слайдера в среде VS2008, которая изменяет процентное масштабирование страницы Silverlight. Другой вопрос, хотя и имеет меньшее значение для вышеупомянутого вопроса, заключается в следующем: с кодом, как он выше, почему я не могу изменить цвет фона «LayoutRoot»? Если я удалю свой UserControl, он будет работать так, как ожидалось.

ответ

1

Решение было в два раза. Во-первых, чтобы внести изменения в событие LayoutUpdated, а не событие Loaded, а во-вторых, подписаться на PropertyChangedCallback PropertyMetadata. Вот полный рабочий код:

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 в зависимости от Proprety. Возможно, вам захочется сделать то же самое для Color on Composite, чтобы вы могли связать его.

+0

Спасибо за ответ, Correl! Я реализовал свойства Composite и Color как свойства Dependency, как вы предполагали, но, к сожалению, это не имело никакого значения для проблемы! –

+0

Если посмотреть на код, я думаю, проблема в том, что вы устанавливаете цвет в событиях OnLoaded. Когда вы меняете цвет, вы не заставляете VS перезагружать элемент управления, чтобы событие не запускалось снова. Вместо того, чтобы устанавливать Fill of Rectangle на значение Color, попробуйте привязать его. Таким образом, когда цвет меняется, свойство Dependency запускает и обновляет его. –

+0

Спасибо Коррел! У меня есть свойство Color, реализованное как свойство Dependency, используя DependencyObject.GetValue и SetValue. Когда я устанавливаю заливку Rectangle, свойство Color, следовательно, уже привязано к свойству зависимости, нет? –

Смежные вопросы