Событие WPF-InkCanvas StrokeErased не срабатывало, когда я использовал inkcanvas1.Strokes.Оператор Erase в C#

#c# #wpf #multi-touch #inkcanvas

#c# #wpf #мультитач #inkcanvas

Вопрос:

Когда я использую inkcanvas1.EditingMode, InkCanvasEditingMode является InkCanvasEditingMode .EraseByPoint это стирание, а также запуск события StrokeErased.
но когда я стираю обводку с помощью inkcanvas1.Strokes .Функция Erase(); тогда событие StrokeErased не срабатывает.
тогда как я могу определить, какой штрих удален, а какие штрихи созданы заново.
рассмотрите на моем inkcanvas тысячи штрихов.
поэтому я не могу поддерживать все добавленные и удаленные штрихи. есть ли какое-либо другое событие или какое-либо решение.

У меня есть приведенный ниже пример кода WPF Inkcanvas кода
XAML

 <Window x:Class="MyWhiteBoard.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyWhiteBoard"
        mc:Ignorable="d"
        WindowState="Maximized"
        Title="MainWindow" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="auto"></RowDefinition>
        </Grid.RowDefinitions>
        <InkCanvas x:Name="inkcanvas1" Grid.Row="0" StrokeErased="inkcanvas1_StrokeErased" MouseMove="inkcanvas1_MouseMove"></InkCanvas>
        <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Width="100" Height="50" Background="WhiteSmoke" Content="Draw" Click="drawInkClick"></Button>
            <Button Width="100" Height="50" Background="WhiteSmoke" Content="Erase by Point" Click="EraseByPointsClick"></Button>
            <Button Width="100" Height="50" Background="WhiteSmoke" Content="Stroke Erase" Click="StrokeEraseClick"></Button>
            <Button Width="100" Height="50" Background="WhiteSmoke" Content="clear all" Click="clearAllClick"></Button>
        </StackPanel>
    </Grid>
</Window>
  

Код, лежащий в основе кода C #

 public partial class MainWindow : Window
    {
        private bool IsStrokeEraseCalled = false;
        public MainWindow()
        {
            InitializeComponent();
        }
        private void inkcanvas1_StrokeErased(object sender, RoutedEventArgs e)
        {
            // why this event is not calling when I use  
            //inkcanvas1.Strokes.Erase
        }
        private void EraseByPointsClick(object sender, RoutedEventArgs e)
        {
            inkcanvas1.EditingMode = InkCanvasEditingMode.EraseByPoint;
        }
        private void StrokeEraseClick(object sender, RoutedEventArgs e)
        {
            inkcanvas1.EditingMode = InkCanvasEditingMode.Select;
            IsStrokeEraseCalled = !IsStrokeEraseCalled;
        }
        private void clearAllClick(object sender, RoutedEventArgs e)
        {
            inkcanvas1.Strokes.Clear();
        }
        private void inkcanvas1_MouseMove(object sender, MouseEventArgs e)
        {
            if (IsStrokeEraseCalled)
            {
                Point currentPoint = e.GetPosition((IInputElement)sender);
                List<Point> enumrator = new List<Point>();
                enumrator.Add(new Point(currentPoint.X, currentPoint.Y));
                StylusShape EraseShape = (StylusShape)new RectangleStylusShape(100, 100, 0);
                inkcanvas1.Strokes.Erase(enumrator, EraseShape);
            }
        }

        private void drawInkClick(object sender, RoutedEventArgs e)
        {
            inkcanvas1.EditingMode = InkCanvasEditingMode.Ink;
        }
    }
  

Ответ №1:

Замените событие StrokeEraseClick следующим кодом:

 private void StrokeEraseClick(object sender, RoutedEventArgs e)
    {
        inkcanvas1.EditingMode = InkCanvasEditingMode.EraseByPoint;
        inkcanvas1.EraserShape = new RectangleStylusShape(100, 100);
        var editMode = inkcanvas1.EditingMode;
        inkcanvas1.EditingMode = InkCanvasEditingMode.None;
        inkcanvas1.EditingMode = editMode;
    }      
  

Он оставит текущий режим в InkCanvasEditingMode .Стирает точки и позволяет удалять стоки определенной области. Событие StrokeErased будет запускаться каждый раз, когда вы стираете штрихи, используя этот подход.

Комментарии:

1. Привет, Маахи, вы стираете штрихи из InkCanvasEditingMode. EraseByPoint . вы увеличили размер стираемой формы inkcanvas по умолчанию. Я задал вопрос Событие inkcanvas1_StrokeErased не срабатывало после выполнения приведенных ниже строк кода. StylusShape EraseShape = (StylusShape)новый прямоугольникstylusshape(100, 100, 0); inkcanvas1.Strokes . Стереть (перечислитель, стирание);

2. Событие Inkcanvas StrokeErased срабатывает автоматически, только если для EditingMode установлено значение EraseByPoint . Надеюсь, это ответ на ваш вопрос. Пожалуйста, обратитесь к следующей ссылке ссылка

3. в моем вопросе в первой строке я уже упоминал, что событие запускалось в режиме EraseByPointMode, но оно не срабатывает, когда я стираю обводку через inkcanvas1.Strokes. Стереть (перечислитель, стирание);

Ответ №2:

попробуйте это

   public MainWindow()
    {
        InitializeComponent();
        inkcanvas1.Strokes.StrokesChanged  = Strokes_StrokesChanged;
    }

    private void Strokes_StrokesChanged(object sender, StrokeCollectionChangedEventArgs e)
    {
        StrokeCollection newlyAddedStroke =  e.Added;
        StrokeCollection oldRemovedStroke = e.Removed;
    }
  

Комментарии:

1. Событие StrokesChanged немедленно вызывается, когда я даже стер одну точку из штриха. но я хочу, чтобы событие, которое оно должно запускать после полного стирания штриха.

Ответ №3:

  1. Когда вы стираете обводку с помощью inkcanvas1.Strokes.Erase(); функции, событие StrokeErased по умолчанию не срабатывает.
  2. Если вы хотите сохранить добавленные и удаленные штрихи, вы можете обработать это в inkcanvas1.Strokes.StrokesChanged событии.
  3. Или вы должны находиться в режиме EraseByPoint и использовать оператор
    inkcanvas1.EraserShape = new RectangleStylusShape(100, 100);
  4. Если у вас есть массовые штрихи на вашем inkcanvas, то для поддержания каждого strokecollection каждый раз, когда это тяжело, у вас есть выбор добавить уникальный идентификатор к каждому штриху, используя свойство ProperyData .