Динамическое изменение цвета обводки

Я использую стилус для рисования линий на холсте. Я хочу изменить цвет обводки нажатием ручки. поэтому я использовал:

DrawingAttributes dattribute = new DrawingAttributes();
inkcan.EditingMode = InkCanvasEditingMode.Ink;

if (stylusInput.pressureFactor < 0.5)
dattribute.Color = Colors.Red;
else
dattribute.Color = Colors.Blue;

inkcan.DefaultDrawingAttributes = dattribute;

но я обнаружил, что цвет меняется только тогда, когда я поднимаю ручку и ретуширую поверхность планшета. Я не уверен, как решить эту проблему.

Любая помощь будет принята с благодарностью.

2 ответа

Решение

Посмотрите на этот вопрос: InkCanvas Eraser

В MSDN говорится:

Если вы измените EraserShape, курсор, отображаемый на InkCanvas, не будет обновлен до следующего изменения EditingMode.

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

Если это так, вы можете переключить свойство EditingMode, как я предложил в связанном ответе.

РЕДАКТИРОВАТЬ

Взгляните на это 3-й вниз говорит:

Конечно, жизнь никогда не бывает такой простой, поэтому есть еще одна небольшая проблема, которую нужно решить. По-видимому, InkCanvas использует различные средства визуализации для конечного результата по сравнению с тем, как рисуются штрихи. Чтобы показать прозрачность, основанную на давлении, в то время как действие рисования все еще выполняется, нам нужно использовать защищенное свойство DyamicRenderer, которое получает / устанавливает объект, используемый для визуализации штрихов в контексте рисования во время рисования штрихов. Этот объект рендеринга должен быть потомком DynamicRenderer. Все, что вам нужно сделать, это переопределить метод OnDraw и изменить используемую кисть. Когда вы присваиваете новое значение этому свойству, InkCanvas фактически изменяет внутренний "Список плагинов", который вызывается всякий раз, когда данные вводятся с помощью стилуса.

Это может быть

Условие if оценивается только один раз, поэтому нет причин менять цвет во время рисования. К сожалению, похоже, что события "onpressurechanged" не происходит, поэтому вам, вероятно, придется настроить цикл, который проверяет давление каждые x миллисекунд и соответствующим образом корректирует цвет. Поскольку вы не хотите замораживать пользовательский интерфейс, вам нужно будет либо запустить его в другом потоке и передать изменение цвета обратно в поток пользовательского интерфейса, либо вы можете поставить проверки давления в диспетчере окон с приоритетом applicationIdle. Это будет выглядеть примерно так:

void checkPressure(InkCanvas inkcan)
{
//return if touch is lifted code here

DrawingAttributes dattribute = new DrawingAttributes();
if (stylusInput.pressureFactor < 0.5)
dattribute.Color = Colors.Red;
else
dattribute.Color = Colors.Blue;
inkcan.DefaultDrawingAttributes = dattribute;
this.Dispatcher.BeginInvoke(new MyPressureDelegate(checkPressure), DispatcherPriority.ApplicationIdle, inkcan);
}

конечно, при условии, что ваш стилус Input разделяет область действия с функцией. В противном случае вам нужно будет передать его вместе с холстом в массиве объектов.

Другие вопросы по тегам