Как я могу изменить способ рисования InkCanvas? - PullRequest
0 голосов
/ 14 февраля 2010

Я искал примеры для этого, но те, с которыми я столкнулся, похоже, сосредоточены на более простых вещах, таких как установка атрибутов InkCanvas DefaultDrawingAttributes, таких как Ширина, Высота, Цвет и т. Д. Не похоже, что материала много для этого.

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

Я знаю, что могу получить новые очки с событием StrokeCollected, но кроме этого я понятия не имею, куда идти. Этот парень , казалось, что он получил код MSDN, работающий, но я не мог этого сделать. Я знаю только, как создать интерфейс с использованием XAML, и, похоже, здесь тоже нет примера.

1010 * редактировать *

Создал переменную класса StrokeCollection с именем thisIsNotNice, инициализировал в конструкторе и сделал это:

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
    myInkCanvas.Strokes = thisIsNotNice;

    foreach (StylusPoint p in e.Stroke.StylusPoints)
    {
        StylusPointCollection spc = new StylusPointCollection();
        spc.Add(p);
        Stroke s = new Stroke(spc);
        s.DrawingAttributes.Height = 3;
        s.DrawingAttributes.Width = 3;
        thisIsNotNice.Add(s);
     }
     e.Handled = true;
}

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

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
     myInkCanvas.Strokes = new System.Windows.Ink.StrokeCollection();
     e.Handled = true;
}

Линии не сохраняются на экране. Поэтому я не понимаю, почему они не стираются в приведенном выше коде.

Если я сделаю это:

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
    foreach (Stroke s in myInkCanvas.Strokes)
            System.Diagnostics.Trace.WriteLine(s);
    e.Handled = true;
}

Я также вижу, что холст содержит штрихи.

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

1 Ответ

1 голос
/ 13 ноября 2010

Звучит так, будто вы хотите настроить способ отображения штрихов на вашем inkCanvas. Здесь следует рассмотреть две разные вещи:

1) То, как они выглядят, когда чернила стекают с пера, до того, как оно будет снято (за это отвечает DynamicRenderer, который работает в другом потоке, чтобы гарантировать, что чернила всегда быстрые. Похоже, вы счастливы с вашим решением к этому уже.

2) Как выглядит возможный штрих, сидящий на холсте. Чтобы настроить это, вы можете попробовать создать подкласс Stroke, переопределив: защищенное переопределение void DrawCore (DrawingContext drawingContext, DrawingAttributes drawingAttributes);

Каждый раз, когда вы получаете stroCollected (и вот та же самая ужасная вещь, о которой вы беспокоились, но все готово), вы удаляете входящий штрих с холста и заменяете его собственной реализацией, крадя данные штриха из входящего. .

Ваша реализация DrawCore будет выглядеть примерно так (псевдокод):

foreach(sp in this.StylusPoints)
  drawingContext.DrawEllipse(RADIUS, sp.X, sp.Y)

И чтобы не получить строки, которые обычно происходят, вы не должны вызывать base.DrawCore (context, attribute) в любой точке.

...