Функциональность повтора на InkCanvas

Я использую InkCanvasи InkToolBarв windows 10 построить 14939 для захвата пользовательских чернильных штрихов.

Я хотел бы сделать пользовательскую кнопку с отменой / повтором, однако у меня есть проблемы, чтобы создать следующее:

private static InkStroke CreateStroke(List<InkPoint> redoInkPoints) {
     var strokeBuilder = new InkStrokeBuilder();
     Matrix3x2 matr = new Matrix3x2();
     return strokeBuilder.CreateStrokeFromInkPoints(redoInkPoints, matr);
}

Однако visual studio жалуется на переменную matr

Система ‘Argment type’.Численные данные.Matrix3x2 ‘не присваивается типу параметров’ Windows.Основа.Численные данные.Matrix3x2′

даже при том, что у меня нет нигде в моем коде за ссылками на окна.основа.численные данные.matrix3x2.

У кого-нибудь есть идея или пример о том, как я использую CreateStrokeFromInkPoints?

1 ответ

  1. Согласно вашему коду, я думаю, что проблема здесь в том, что вы использовали неправильную матрицу в InkStrokeBuilder.CreateStrokeFromInkPoints метод. При использовании Matrix3x2 matr = new Matrix3x2();создается нулевая матрица . Это приведет к коллапсу всех ваших точек в сингулярность, которая здесь не является допустимым значением. Чтобы устранить эту проблему, можно использовать систему.Численные данные.Matrix3x2.Свойство Identity, представляющее матрицу идентификаторов. А ниже приведен простой пример:

    код XAML:

    <StackPanel>
        <InkCanvas x_Name="inkCanvas" Width="500" Height="200" />
        <Button Click="Button_Click">Add a stroke</Button>
    </StackPanel>
    

    С фоновым кодом:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        List<InkPoint> inkPoints = new List<InkPoint> { new InkPoint(new Point(10, 10), 0.5f), new InkPoint(new Point(100, 100), 0.5f) };
    
        InkStroke stroke = CreateStroke(inkPoints);
    
        inkCanvas.InkPresenter.StrokeContainer.AddStroke(stroke);
    }
    
    private static InkStroke CreateStroke(List<InkPoint> redoInkPoints)
    {
        var strokeBuilder = new InkStrokeBuilder();
        System.Numerics.Matrix3x2 matr = System.Numerics.Matrix3x2.Identity;
        return strokeBuilder.CreateStrokeFromInkPoints(redoInkPoints, matr);
    }