【问题标题】:Clear pixels in WPF CanvasWPF 画布中的清除像素
【发布时间】:2011-06-20 12:35:23
【问题描述】:

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

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

对于不透明的画布,我会简单地使用背景画笔,但在这种情况下它是 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 ); } }

【问题讨论】:

  • 你是如何绘制你的折线的?发布一些代码(包括当前不工作的代码)会有所帮助。
  • @Harald:您好像不小心创建了两个帐户。关注instructions given here 让版主合并您的帐户。
  • 我在上面的问题中添加了代码。基本上,我需要能够像上面那样绘制折线,但作为橡皮擦工具,即清除画布上折线路径中的任何内容。

标签: wpf canvas


【解决方案1】:

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

你添加到 Canvas 的每条折线实际上都是一个 FrameworkElement(一种轻量级控件)并且它们都是按顺序绘制的(就像添加多个标签或编辑控件一样,控件无法改变窗口上的另一个控件,除了将其覆盖)。

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

【讨论】:

  • 好的,这是有道理的,我也在考虑使用图像。你建议我如何在图像上画画?我尝试使用 RenderTargetBitmap 但没有让它工作。此外,绘图表面最终将是全屏尺寸。考虑到几乎每次鼠标移动都需要更新位图/图像,我怀疑会遇到性能问题...
  • @Harald - 你不能拥有这一切 - WriteableBitmap 类是为高性能而构建的,但只为您提供原始像素访问(没有好的 DrawPolyline 方法),来自 System.Drawing 命名空间的类(是的,您可以从 WPF 应用程序中使用它们)将使绘图变得容易但会很慢 - 您必须根据您的应用程序进行权衡。
【解决方案2】:

使用 InkCanvas 代替折线。它已经实现了一个橡皮擦

【讨论】:

    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2012-03-14
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多