Эквивалент ластика для приложения для рисования, c #, silverlight, wp7 - PullRequest
2 голосов
/ 25 мая 2011

Я работаю над простым приложением для рисования, чтобы улучшить свои навыки, и я не могу разобраться в логике инструмента ластика. Приложение просто использует класс Line для создания линий, когда пользователь перемещает палец. Для инструмента ластика я попытался использовать VisualTreeHelper следующим образом:

List<UIElement> elements = (List<UIElement>)VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(tree), ContentPanelCanvas);

            foreach (UIElement element in elements)
            {
                if (element is Line)
                {
                    this.ContentPanelCanvas.Children.Remove(element);
                }
            }

Это в некоторых моментах, но может быть очень медленным и медленным. Иногда мне приходилось касаться области более 5 раз, чтобы избавиться от линии там.

Есть ли альтернатива этому?

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

e.GetPosition(tree) будет возвращать точку. Попробуйте вместо этого использовать Rect с позицией в качестве центра.

const double fingerMargin = 10.0;

Point p = e.GetPosition(tree);
Rect r = new Rect(p.X - fingerMargin, p.Y - fingerMargin, fingerMargin * 2, fingerMargin * 2); 

var elements = VisualTreeHelper.FindElementsInHostCoordinates(r, ContentPanelCanvas);

Line lineToRemove = elements.OfType<Line>().FirstOrDefault();
if (lineToRemove != null)
{
    ContentPanelCanvas.Children.Remove(lineToRemove);
}

Примечание: не приводите результат FindElementsInHostCoordinates к List<T>, что является подробностью реализации, документация только гарантирует, что это будет IEnumerable<UIElement>, кроме того, что это ненужное приведение.

1 голос
/ 25 мая 2011

Вы на самом деле ищете набор элементов, которые соответствуют тесту попадания одного пикселя. Если ваши линии узкие, то это как иголка в стоге сена; очень трудно попасть в очередь точно, чтобы удалить ее.

Вместо этого вам нужно использовать нечеткое совпадение, используя прямоугольник вместо точки. Вы можете использовать тот же API, только его прямоугольную версию:

0 голосов
/ 02 августа 2013

VisualTreeHelper.FindElementsInHostCoordinates (r, MainCanvas);Не возвращает никаких элементов.

...