Я использую самую последнюю версию 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, он будет работать так, как ожидалось.
Спасибо за ответ, Correl! Я реализовал свойства Composite и Color как свойства Dependency, как вы предполагали, но, к сожалению, это не имело никакого значения для проблемы! –
Если посмотреть на код, я думаю, проблема в том, что вы устанавливаете цвет в событиях OnLoaded. Когда вы меняете цвет, вы не заставляете VS перезагружать элемент управления, чтобы событие не запускалось снова. Вместо того, чтобы устанавливать Fill of Rectangle на значение Color, попробуйте привязать его. Таким образом, когда цвет меняется, свойство Dependency запускает и обновляет его. –
Спасибо Коррел! У меня есть свойство Color, реализованное как свойство Dependency, используя DependencyObject.GetValue и SetValue. Когда я устанавливаю заливку Rectangle, свойство Color, следовательно, уже привязано к свойству зависимости, нет? –