Как сохранить штрихи InkCanvas внутри InkCanvas в UWP

Рассмотрим следующий InkCanvas в приложении UWP, который является единственным элементом внутри Grid (опущен для краткости).

<InkCanvas x:Name="inkCanvas" Width="500" Height="500"/>

Нарисуйте обводку, которая начинается где-то внутри InkCanvas, и продолжайте обводку за пределами границ InkCanvas. Визуально у вас будет впечатление, что штрих заканчивается на границе (например, на правом краю InkCanvas). Но это не так. Измените размер InkCanvas с помощью Button , например.

  private void SizeButton_Click(object sender, RoutedEventArgs e)
  {
     inkCanvas.Width = 2000;
     inkCanvas.Height = 2000;
  } 

и вы увидите часть штриха, которая была нарисована за пределами InkCanvas. Эта часть также будет видна, если вы сохраните свой штрих в формате gif или isf, с изменением размера или без него, что очень печально. Эта проблема возникает у нескольких приложений с возможностями рукописного ввода в магазине Windows.

Вопрос: Почему так и как этого избежать??


person Octopus    schedule 09.04.2017    source источник


Ответы (1)


Я работал с командой над программным обеспечением для рисования до того, как InkCanvas появился на сцене, и у нас была такая же проблема. «Что нам делать, когда пользователь перетаскивает перо за пределы прямоугольной области, где ему разрешено рисовать?» В конце концов мы пришли к тому же выводу, что и InkCanvas, а именно: продолжать идти по пути.

Причина такого решения пришла после проб и ошибок.

Мы попытались обрезать путь, то есть обрезать его там, где он пересекает край. Но мы столкнулись с проблемой, когда пользователь запускал перо за пределы коробки, но затем возвращался тем же росчерком. Думайте об этом как о коробке для подписи. Мы предоставили пользователю пунктирную область, где он мог поставить цифровую подпись, но почти у всех была преувеличенная подпись, выходящая за границы пунктирной области. Мы не могли обрезать, потому что фактически потеряли бы важную часть подписи.

Мы также попытались привязать путь к краям. Когда пользователь перетаскивал мышь за пределы поля, чернила привязывались либо вертикально, либо горизонтально вдоль края области. По крайней мере, с помощью этого метода пользователь получит мгновенную обратную связь о том, что происходит при перетаскивании за пределы региона. Это было ужасно. Плохой пользовательский опыт повсюду и много хейтерских писем.

Итак... мы оставили это в покое. Коробка никак не влияет на мазки тушью.

Теперь, чтобы помочь вам в вашей ситуации. Если вы хотите обрезать путь, вы можете использовать Win2D для преобразования накопленных штрихов пера в геометрию и пересечь его с прямоугольной геометрией того же размера, что и ваш InkCanvas (500x500). Если вас интересует это направление, Майк Толти написал об этом пост. Единственное, в чем я не уверен, так это в том, что вы можете взять окончательную обрезанную геометрию и преобразовать ее обратно в InkStroke. Это может быть односторонняя операция. Вам придется раскопать это.

person Laith    schedule 09.04.2017
comment
Лейт спасибо за эту информацию. Я немного остановлюсь на этом, чтобы посмотреть, что я могу сделать. Тем временем я был бы признателен, если бы вы могли прокомментировать следующий вопрос, если у вас есть время, и который имеет сходство (но отличается) с текущей темой stackoverflow.com/questions/43280886/ . - person Octopus; 09.04.2017