События Canvas Click в Silverlight, если не над элементом UIElement

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

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

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

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

4 ответа

Решение

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

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

Наиболее естественным является захват Canvas"s 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
    }

}

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

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

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

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

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

Другие вопросы по тегам