清除WPF Canvas中的像素

时间:2011-02-03 09:04:38

标签: wpf canvas

我有一个透明的画布,我可以用鼠标绘制任意折线。 大多数线都是半透明的。

现在我需要某种橡皮擦工具,即带有橡皮擦刷的折线,可以沿着鼠标移动清除像素。

使用不透明的画布我会简单地使用背景画笔,但在这种情况下它是Color.FromArgb(0,0,0,0)并且使用它绘制无效。

画布似乎是某种alpha混合模式,它将我绘制的任何东西与已经存在的东西混合在一起,除非我将alpha通道设置为255,否则画布上的任何内容都将被覆盖。这对我没有帮助,因为我只想清除像素,即使它们完全透明。

有什么想法吗?

这是我正在使用的代码的主要部分:

public class WPFWindow : Window { private Canvas canvas = new Canvas(); private bool LDown = false; private Polyline lines; private PointCollection points; public WPFWindow() { this.AllowsTransparency = true; this.WindowStyle = WindowStyle.None; this.Background = new SolidColorBrush( Color.FromArgb(50,0,0,0) ); this.Width = 500; this.Height = 400; this.Top = this.Left = 0; canvas.Width = this.Width; canvas.Height = this.Height; canvas.Background = new SolidColorBrush( Color.FromArgb(0,0,0,0) ); this.Content = canvas; this.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler( WPFWindow_MouseLeftButtonDown ); this.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler( WPFWindow_MouseLeftButtonUp ); this.MouseMove += new System.Windows.Input.MouseEventHandler( WPFWindow_MouseMove ); } void WPFWindow_MouseMove( object sender, System.Windows.Input.MouseEventArgs e ) { if( LDown ) { points.Add( e.GetPosition(null) ); } } void WPFWindow_MouseLeftButtonUp( object sender, System.Windows.Input.MouseButtonEventArgs e ) { LDown = false; } void WPFWindow_MouseLeftButtonDown( object sender, System.Windows.Input.MouseButtonEventArgs e ) { LDown = true; lines = new Polyline(); points = new PointCollection(); lines.Stroke = new SolidColorBrush( Color.FromArgb( 128, 180, 80, 80 ) ); lines.StrokeThickness = 20; lines.Points = points; points.Add( e.GetPosition(null) ); canvas.Children.Add( lines ); } }

2 个答案:

答案 0 :(得分:2)

WPF Canvas控件不是绘图表面,它是一个“Panel”,一个排列多个其他控件的容器。

您添加到Canvas的每条Polyline实际上都是一个FrameworkElement(一种轻量级控件),它们都按顺序绘制(就像添加多个标签或编辑控件一样,控件无法改变视觉表示形式窗户上的另一个控件,除了覆盖它。)

您可能想要创建一个实际图像在图像上绘制折线并显示该图像,然后您可以谈论清除像素。

答案 1 :(得分:1)

使用InkCanvas而不是折线。它已经实现了橡皮擦