WPF MouseWheel и KeyDown не вызывается без фокуса ввода? - PullRequest
0 голосов
/ 16 марта 2011

У меня есть собственный класс (ItemsContainer), который содержит несколько кнопок и пользовательские элементы управления.

Я внедряю навигационную систему, используя мышь и ввод, и пользователь может «панорамировать», используя щелчок правой кнопкой мыши ... но, если пользователь не нажимает что-то интерактивное (кнопка и т. Д.), Мои методы для «колесика мыши» и « keydown 'не называются.

В лучшей статье, которую я нашел до сих пор, сказано, что мне нужно «зацепиться» за каждый элемент управления !! Звучит глупо, разбирать каждый визуальный узел и добавлять EventHandlers везде ... должен быть более простой способ.

Есть?

1 Ответ

1 голос
/ 16 марта 2011

Есть несколько пунктов, включенных в этот вопрос, которые необходимо решить.

Во-первых, RoutedEvent будет распространяться вверх и вверх по визуальному дереву.Поэтому, если у вас есть встроенные элементы управления в такие элементы управления, как этот ...

    <Grid Name="MyGrid">
        <StackPanel>
            <Button>Button 1</Button>
            <Button>Button 2</Button>
            <Button>
                <TextBlock>Button 3</TextBlock>
            </Button>
        </StackPanel>
    </Grid>

... прикрепление события для обработки поведения KeyDown на MyGrid;получит любой KeyDown RoutedEvent изнутри своих детей.

Существует одна оговорка, если событие помечено как обработанное элементом управления в визуальном дереве, что будет иметь место для элемента управления Button и MouseLeftButtonDown RoutedEvent;Затем вам нужно будет настроить способ регистрации.Это достаточно просто и может быть сделано следующим образом;где true указывает, что вы хотите получать уведомления, даже если другой обработчик пометил событие как обработанное.

    public Window1()
    {
        InitializeComponent();

        MyGrid.AddHandler(UIElement.MouseLeftButtonDownEvent, new RoutedEventHandler(MouseLeftButtonDown), true);
    }

    private void MouseLeftButtonDown(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("MouseLeftButtonDown Fired");
    }

Если вы перейдете к отладчику, вы увидите, что источник RoutedEvent при нажатии* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *;так как вы можете использовать различные RoutedEvents.

Фокус все еще должен существовать где-то внутри приложения;это можно легко установить с помощью родительского элемента управления и вызова Focus.

...