你在做WPF的WinForms方式。不要这样做。这就像在C++中编写VB代码一样。它只能以眼泪结束。
要做到这一点的WPF方式,使用数据绑定和视图模型类来执行“一次不超过3”的逻辑。然后,对于UI,只需绑定到视图模型中的PointList。
这是我的XAML应该看起来像。注意我只是使用ItemsControl和Canvas,然后将ItemsSource绑定到PointList:
<Window x:Class="WpfTester.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">
<ItemsControl ItemsSource="{Binding Path=PointList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Fill="Red" Width="25" Height="25" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Path=X}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Window>
然后我们只需要创建PointList。我们将使用正常WPF是指:视图模型类来保存点列表:
class MainViewModel
{
public MainViewModel()
{
PointList = new ObservableCollection<Point>();
// Some example data:
AddPoint(new Point(10, 10));
AddPoint(new Point(200, 200));
AddPoint(new Point(500, 500));
}
public ObservableCollection<Point> PointList { get; private set; }
public void AddPoint(Point p)
{
// 3 at most, please!
if (PointList.Count == 3)
{
PointList.RemoveAt(0);
}
PointList.Add(p);
}
}
的奶酪片,是吗?所以最后一部分只是告诉XAML加载你的视图模型。里面的代码隐藏你的XAML,在DataContext设置为您的视图模型:
// Inside MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
// Add this line:
this.DataContext = new MainViewModel();
}
现在你已经有了到位,你可以添加/简单地通过调用视图模型在你的代码的任何地方删除矩形。 AddPoint或viewModel.PointList.Remove,UI将自动更新以反映更改。
我想我在我的问题的底部解释得很清楚:1 )在一个点绘制一个矩形 2)删除矩形/点后,有多于 3. 是的,我很遗憾地知道我在做它的WinForms方式:( – DMan 2010-08-24 18:32:11
好吧,我会更新我的答案,包括一个正确的方法来做到这一点。 – 2010-08-24 18:35:57
好吧,我已经更新了我的答案,包括一个正确的方法来做到这一点与WPF数据绑定的例子。 – 2010-08-24 18:58:44