События Canvas Click в Silverlight, если не над элементом UIElement - PullRequest
3 голосов
/ 09 июня 2009

У меня есть объект canvas, и я разбрасываю его фантастическими элементами управления. Я использую объект ScaleTransform для масштабирования холста, чтобы я мог увеличивать / уменьшать.

Я подключил элементы управления, чтобы я мог перетаскивать их, и перетаскивание работает хорошо, используя MouseLeftButtonDown, MouseLeftButtonUp и MouseMove. Теперь я хочу включить включение события, когда я нажимаю только на холст. Когда я читаю docs для объекта canvas, я вижу, что событие MouseLeftButtonDown срабатывает только тогда, когда оно находится над UIElement.

Происходит, когда левая кнопка мыши нажата (или когда кончик стилуса прикасается к планшету) пока мышь указатель на UIElement. (Унаследовано от UIElement.)

К сожалению, я хочу противоположное поведение. Я хочу знать, когда мышь щелкает по холсту, когда указатель мыши не находится над какими-либо элементами управления. Поскольку я новичок в Silverlight, я могу поступить неправильно. Есть что-то, что я упустил? Я поступаю об этом неправильно? Я ищу небольшую помощь и, возможно, много указаний.

Ответы [ 4 ]

4 голосов
/ 10 июня 2009

Я не гуру Silverlight, но не могли бы вы добавить прозрачный UIElement к Canvas ниже всех других UIElement с и использовать его, чтобы определить, нажал ли пользователь за пределами любого другого перетаскивания / drop-способные элементы.

2 голосов
/ 10 июня 2009

Вы хотите знать, когда происходит щелчок по Canvas и не по другим элементам управления?

Самым естественным является захват Canvas MouseLeftButtonDown. Внутри этого события возьмите пик, чтобы увидеть, где произошел щелчок. Затем пик в UIElement с под щелчком. Я рекомендую вам держать все в абсолютных координатах, чтобы все было прямо. Что-то вроде:

void Page_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Point p = e.GetPosition(null);
    var elements =  VisualTreeHelper.FindElementsInHostCoordinates(p, App.Current.RootVisual);
    foreach (var element in elements)
    {
        //Figure out if you're over a particular UI element
    }

}
1 голос
/ 10 июня 2009

Я думаю, что вы, возможно, неправильно истолковали документацию. Согласно MSDN, сам Canvas является реализацией UIElement:

System.Windows.UIElement
  System.Windows.FrameworkElement
    System.Windows.Controls.Panel
      System.Windows.Controls.Canvas

Исходя из моего опыта и исправьте меня, если я ошибаюсь, MouseLeftButtonDown обычно срабатывает только для самого верхнего нажатого элемента UIElement. Поэтому, если вы реализуете MouseLeftButtonDown для своего Canvas, он должен срабатывать только при нажатии на Canvas, а НЕ при нажатии на кнопки. Я бы сказал, попробуйте сначала.

0 голосов
/ 10 июня 2009

Я думаю, что в WPF это легко решается путем перенаправления событий. Однако Silverlight не получил эту функцию. Вы можете проверить VisualTreeHelper.FindElementsInHostCoordinates. Эта статья освещает это немного.

http://www.andybeaulieu.com/Default.aspx?tabid=67&EntryID=95

...