我定义了两个UserControls
:
- 绘图:包含一个
CustomCanvas
派生自Canvas
. - 控件:包含一个
Button
和用于改变GlobalThickness
属性MyViewModel.cs
CustomCanvas
有一个名为 的自定义依赖属性Thickness
。GlobalThickness
这在 XAML 中是绑定的。
我还重写了绘制 a的OnRender
方法,使用它的厚度设置为.CustomCanvas
Rectangle
Pen
Thickness
当我单击 时Button
,GlobalThickness
更改和Thickness
绑定到它的 也发生了变化。但我没有得到Rectangle
一个新的Thickness
。
到目前为止,这是我整理的所有代码。
<Window x:Class="WpfApplication23.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:WpfApplication23">
<Window.DataContext>
<local:MyViewModel></local:MyViewModel>
</Window.DataContext>
<StackPanel>
<local:Drawing/>
<local:Control/>
</StackPanel>
</Window>
<UserControl x:Class="WpfApplication23.Drawing"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:wpfApplication23="clr-namespace:WpfApplication23">
<Grid>
<wpfApplication23:CustomCanvas Thickness="{Binding GlobalThickness}"
Height="100"
Width="100"
Background="Blue"/>
</Grid>
</UserControl>
<UserControl x:Class="WpfApplication23.Control"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Button Content="Change Thickness"
Width="200"
Height="30"
Click="ButtonBase_OnClick"/>
</StackPanel>
</UserControl>
public partial class Control
{
public Control()
{
InitializeComponent();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
var vm = (MyViewModel)DataContext;
vm.GlobalThickness = 10;
}
}
public class CustomCanvas : Canvas
{
public int Thickness
{
private get { return (int)GetValue(ThicknessProperty); }
set
{
SetValue(ThicknessProperty, value);
InvalidateVisual();
}
}
public static readonly DependencyProperty ThicknessProperty =
DependencyProperty.Register("Thickness", typeof(int), typeof(CustomCanvas), new PropertyMetadata(0));
protected override void OnRender(DrawingContext dc)
{
var myPen = new Pen(Brushes.Red, Thickness);
var myRect = new Rect(0, 0, 400, 400);
dc.DrawRectangle(null, myPen, myRect);
}
}
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private double _globalThickness = 1;
public double GlobalThickness
{
get { return _globalThickness; }
set
{
_globalThickness = value;
RaisePropertyChanged("GlobalThickness");
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}