2011-02-03 3 views
1

У меня есть прозрачный холст, на котором я могу рисовать произвольные полилинии с помощью мыши. Большинство линий являются полупрозрачными.Очистить пиксели в WPF Canvas

Теперь мне нужен какой-то инструмент для ластиков, т. Е. Полилиния с ластикой, которая позволяет очищать пиксели вдоль движения мыши.

С непрозрачным холстом я бы просто использовал кисть для фона, но в этом случае это Color.FromArgb (0,0,0,0), а рисунок с этим не имеет эффекта.

Полотно, похоже, находится в каком-то режиме альфа-смеси, который смешивает все, что я нарисовал на нем, тем, что уже существует, если я не установил альфа-канал на 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); } }

+0

Как вы рисуете свои полилинии? Проводка некоторого кода (включая материал, который в настоящее время не работает) поможет. –

+0

@ Харальд: Похоже, вы случайно создали две учетные записи. Следуйте инструкциям [здесь] (http://meta.stackexchange.com/questions/18232/how-can-one-link-merge-combine-associate-two-accounts-users-anonymous-unregiste/73801#73801) чтобы модератор объединил ваши учетные записи. –

+0

Я добавил код к вопросу выше. В принципе, мне нужно иметь возможность рисовать полилинии, как указано выше, но как инструмент ластик, т. Е. Очищать что-либо в пути полилинии на холсте. – Harald

ответ

2

управления WPF Canvas не поверхностный рисунок, это «панель», контейнер, который организует множество других управления.

Каждая полилиния, которую вы добавляете на холст, на самом деле является элементом FrameworkElement (своего рода легким управлением), и все они нарисованы по порядку (это похоже на добавление нескольких меток или элементов управления редактированием, нет никакого способа, которым элемент управления может изменить визуальное представление другого контроля над окном, за исключением покрытия его).

Возможно, вы захотите создать фактическое изображение, нарисовать полилинии на изображении и отобразить это изображение, затем вы можете говорить об очистке пикселей.

+0

ОК, это имеет смысл, и я думал об использовании изображения. Как вы предлагаете рисовать изображение? Я попытался использовать RenderTargetBitmap, но не получил его на работу. Кроме того, поверхность чертежа, в конце концов, будет иметь размер в полноэкранном режиме. Я подозреваю, что сталкиваются с проблемами производительности, учитывая, что битмап/изображение нужно обновлять практически с каждым движением мыши ... – Harald

+0

@Harald - У вас не может быть всего этого - класс WriteableBitmap построен для высокой производительности, но только дает вам (без использования метода DrawPolyline), классы из пространства имен System.Drawing (да, вы можете использовать их из приложения WPF) упростит рисование, но будут медленными - вам нужно сделать компромисс на основе вашего приложения. – Nir

1

Используйте InkCanvas вместо полилиний. У него уже есть ластик