2010-08-24 78 views
2

去除形状在GDI + /的WinForms,我能做到这一点的Click()事件和使用图形对象:图纸和WPF

AddPoint(p); //Add Point contains some code to make sure there is only 3 dots 
foreach (Point p in PointList) { 
    DrawRectangle(p); 
} 
Invalidate(); 

如果我尝试在WPF类似的东西,它不会清理我创建的点(我猜是因为WPF的工作原理)。这意味着如果我检查确保一次只有三个点,并弹出最长的点为新的点留出空间,则绘制的矩形将仍然存在。

所以,问题是,我怎么可以创建WPF的东西,让我

  • 在距离一个WPF画布上绘制一个矩形
  • 删除矩形/分后有超过3

回答

8

你在做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将自动更新以反映更改。

+0

我想我在我的问题的底部解释得很清楚:1 )在一个点绘制一个矩形 2)删除矩形/点后,有多于 3. 是的,我很遗憾地知道我在做它的WinForms方式:( – DMan 2010-08-24 18:32:11

+0

好吧,我会更新我的答案,包括一个正确的方法来做到这一点。 – 2010-08-24 18:35:57

+0

好吧,我已经更新了我的答案,包括一个正确的方法来做到这一点与WPF数据绑定的例子。 – 2010-08-24 18:58:44

1

我会使用wpf数据绑定将画布的内容绑定到您存储的其他矩形集合。无论如何,如果你想做严肃的WPF开发,你需要学习数据绑定。

编辑:当然你只是存储矩形,数据绑定应该为每个矩形创建一个形状。

+0

如何数据绑定位置(x/y)的矩形? – DMan 2010-08-24 18:30:10

+0

这是您需要的几何图元: http://msdn.microsoft.com/en-us/library/system.windows.media.rectanglegeometry.aspx – 2010-08-24 18:39:34

+0

然后检查此答案是否有类似的问题:http:// stackoverflow .com/questions/889825/wpf-is-it-it-possible-binding-a-canvass-children-property-in-xaml/1030191#1030191 – 2010-08-24 18:46:17