Динамическое изменение цвета обводки - PullRequest
1 голос
/ 03 августа 2011

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

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 ]

2 голосов
/ 03 августа 2011

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

В MSDN указано:

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

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

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

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

Посмотрите на это 3-й внизОн говорит:

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

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

1 голос
/ 03 августа 2011

Условие 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 разделяет область действия с функцией, конечно.В противном случае вам нужно будет передать его вместе с холстом в массиве объектов.

...