Отключить всплывающее окно «Silverlight» в выпадающих списках - PullRequest
5 голосов
/ 30 сентября 2010

Привет Я пытаюсь избавиться от надоедливого контекстного меню «О Silverlight», которое появляется при каждом щелчке правой кнопкой мыши в приложении Silverlight. Я добавил обычные способы:

In App.xaml
rootVisual.MouseRightButtonDown + = ((s, args) => args.Handled = true);

и то же самое для всех ChildWindows. Проблема, которая сохраняется, заключается во всех «всплывающих» элементах управления, таких как выпадающие списки и всплывающее окно календаря. Там я не могу избавиться от этого. Я хотел бы обработать щелчок правой кнопкой мыши в стиле, который я могу сделать неявным для всего приложения. Это возможно? Могу ли я решить это каким-то другим умным способом?

Best
Daniel

Ответы [ 2 ]

6 голосов
/ 25 ноября 2010

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

public class CellaComboBox : ComboBox
{
    public CellaComboBox()
    {
        DropDownOpened += _dropDownOpened;
        DropDownClosed += _dropDownClosed;
    }

    private static void _dropDownClosed(object sender, EventArgs e)
    {
        HandlePopupRightClick(sender, false);
    }

    private static void _dropDownOpened(object sender, EventArgs e)
    {
        HandlePopupRightClick(sender, true);
    }

    private static void HandlePopupRightClick(object sender, bool hook)
    {
        ComboBox box = (ComboBox)sender;
        var popup = box.GetChildElement<Popup>();
        if (popup != null)
        {
            HookPopupEvent(hook, popup);
        }
    }

    static void HookPopupEvent(bool hook, Popup popup)
    {
        if (hook)
        {
            popup.MouseRightButtonDown += popup_MouseRightButtonDown;
            popup.Child.MouseRightButtonDown += popup_MouseRightButtonDown;
        }
        else
        {
            popup.MouseRightButtonDown -= popup_MouseRightButtonDown;
            popup.Child.MouseRightButtonDown -= popup_MouseRightButtonDown;
        }
    }


    static void popup_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        e.Handled = true;
    }

с методом расширения для framworkelement, похожим на это:

public static class FrameworkElementExtensions
{
    public static TType GetChildElement<TType>(this DependencyObject parent) where TType : DependencyObject
    {
        TType result = default(TType);

        if (parent != null)
        {
            result = parent as TType;

            if (result == null)
            {
                for (int childIndex = 0; childIndex < VisualTreeHelper.GetChildrenCount(parent); ++childIndex)
                {
                    var child = VisualTreeHelper.GetChild(parent, childIndex) as FrameworkElement;
                    result = GetChildElement<TType>(child) as TType;
                    if (result != null) return result;
                }
            }
        }

        return result;
    }
}

Вам нужно обрабатывать DatePicker таким же образом, но вместо DropDownOpened и DropDownClosed вы используете CalenderOpened и CalenderClosed

2 голосов
/ 04 ноября 2010

В C # Corner есть статья для исправления всплывающего окна about about в Silverlight 3:

Отключить контекстное меню в приложении Silverlight 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...