Как вызывать и захватывать события мыши из класса (без наследования от элемента управления)?

У меня что-то не получается, и мне нужна помощь!

Мой контекст:

Приложение Windows WPF, которое отображает сгенерированные кодом полигоны на карте Virtual Earth 3D.

Моя проблема:

Невозможно превратить сгенерированные полигоны в "интерактивные элементы".

Предпринятые шаги:

Мой первый подход заключался в использовании конвейера присоединения событий VE, это не что иное, как «наблюдение» за всеми событиями, возникающими в элементе управления 3D-глобусом, и возвращение списка всего, что существует в месте для щелчка. Хотя это работает, я получаю ужасное смещение при каждом щелчке мыши, что делает этот подход бесполезным на данный момент.

Мой второй подход заключался в прикреплении обработчиков щелчка мышью к полигонам. Для этого я создал этот класс:

  public class ExtendedPolygon:PolygonGeometry
  {

  }

Это расширяет исходный объект PolygonGeometry. Затем я последовал совету, размещенному в этом потоке , давая классам события щелчка C # для реализовать "слушатели" и обработчики событий, например:

public event EventHandler<MouseEventArgs> Click;

protected void OnClick(MouseEventArgs e)
    {
        EventHandler<MouseEventArgs> handler = Click;
        if (handler != null)
        {
            handler(this, e);
        }
    }

 internal void CheckIfClicked(MouseEventArgs e) 
 {
   OnClick(e);
 }

Затем (и для простоты при тестировании) я сделал все событие, прикрепленное к моей странице с кодом представления:

polygon.Click +=new EventHandler<MouseEventArgs>(polygon_MouseClick);



void pol_MouseClick(object sender, MouseEventArgs e)
    {
            ShowBox(" ShapeId:" + "I clicked");  
    }

Итак, мой код запускается, полигоны отображаются, но события щелчка не возникают. Оставив меня со следующими вопросами:

-Я что-то не так делаю? Как мне подключить весь конвейер для захвата и вызова событий мыши из класса (который не наследуется от элемента управления) в WPF?

-Любые идеи о том, как это исправить?

Спасибо за чтение и за время, потраченное на это дело!

PS: Если кто-нибудь знает, как лучше прикрепить события к Полигонам Virtual Earth, я все уши =)


person RFLG    schedule 23.11.2011    source источник
comment
Используйте snoop, чтобы увидеть, запускается ли событие Click, и если да, то обрабатывается ли оно каким-либо элементом управления в визуальном дереве.   -  person treehouse    schedule 24.11.2011
comment
@RFLG, MouseEtner / MouseLeave работает?   -  person    schedule 24.11.2011
comment
@KaiWang: не могли бы вы подробнее рассказать о ситуации со «Snoop»?   -  person RFLG    schedule 24.11.2011
comment
@ Дмитрий: Я не пробовал (думал, что проще будет протестировать одним щелчком мыши), вы что-то имеете в виду?   -  person RFLG    schedule 24.11.2011
comment
Я думаю, что у перенаправленных событий больше шансов сработать, также я бы старался всегда использовать AddHandler в пользу синтаксиса + =, так как таким образом вы также можете обрабатывать обработанные события.   -  person    schedule 24.11.2011


Ответы (1)


Я не вижу кода, который на самом деле вызывает CheckIfClicked, в исходном посте это было сделано в переопределении OnMouseUp. Есть ли в вашем приложении где-то похожий код, которого не было в вашем вопросе?

person Bill Reiss    schedule 23.11.2011
comment
Ну, вроде того ... поскольку у меня нет события, которое можно было бы переопределить в WPF (или, по крайней мере, я не мог его найти), я подключил эту проверку к событию OnClick в Globe Control. Хотя не знаю, правильный ли это путь - person RFLG; 24.11.2011