#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:
- Когда вы стираете обводку с помощью
inkcanvas1.Strokes.Erase();
функции, событие StrokeErased по умолчанию не срабатывает. - Если вы хотите сохранить добавленные и удаленные штрихи, вы можете обработать это в
inkcanvas1.Strokes.StrokesChanged
событии. - Или вы должны находиться в режиме EraseByPoint и использовать оператор
inkcanvas1.EraserShape = new RectangleStylusShape(100, 100);
- Если у вас есть массовые штрихи на вашем inkcanvas, то для поддержания каждого strokecollection каждый раз, когда это тяжело, у вас есть выбор добавить уникальный идентификатор к каждому штриху, используя свойство ProperyData .