Проблема события WPF Prism Key - PullRequest
0 голосов
/ 20 апреля 2010

У меня возникли проблемы при попытке решить следующую проблему.

У меня есть 2 модуля с видами (A & B).

в модуле A у меня есть список с пунктами 1-4. у меня есть событие key up, которое срабатывает каждый раз, когда я нажимаю клавишу «Ввод», чтобы открыть модуль B, это событие находится в сетке, содержащей список.

в модуле B у меня есть кнопка, которая закрывает модуль B и открывает модуль A. Единственное свойство, которое я установил для этого элемента управления, это IsDefault = true.

Когда я нажимаю «Enter», модуль B закрывает, но модуль A теперь также фиксирует событие Key Up, что приводит к бесконечной петле нажатий клавиш «Enter».

Я борюсь с этим уже 2 дня, поэтому любая помощь будет признательна.

Пример кода ниже:

Модуль A - .xaml

<UserControl x:Class="Module1.UxModule1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" d:DesignHeight="700" d:DesignWidth="800">
      <Grid Focusable="False">
        <Grid Name="MainGrid"  KeyUp="MainGrid_KeyUp" Loaded="UserControl_Loaded">
            <ListBox Grid.Column="0" Width="Auto" Foreground="White" Background="Black" Height="520" BorderThickness="0" Name="lstMenuLeft" IsTabStop="True" IsSynchronizedWithCurrentItem="False" IsTextSearchEnabled="False"></ListBox>
             </Grid>
        </Grid>
</UserControl>

Модуль A - .cs

    private void MainGrid_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            if (lstMenuLeft.SelectedItems.Count > 0)
            {
                MessageBox.Show(lstMenuLeft.SelectedItem.ToString());
                OpenModuleB();
            }
        }
     }

    //standard prism code to inject new view.
    private void OpenModuleB()
    {

        var regionManager = _container.Resolve<IRegionManager>();
        var view = regionManager.Regions["Main"].GetView("uxMod2");

        if (view == null)
        {
            var m = _container.Resolve<IModuleManager>();
            m.LoadModule("Mod2");
        }
        else
        {
            regionManager.Regions["Main"].Activate(view);
        }

    }

    //make sure i have focus on the listbox to allow my keyboard to move up and down.
    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        lstMenuLeft.Focus();
    }

Модуль B - .xaml

<UserControl 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" 
             d:DesignHeight="800" d:DesignWidth="600">
    <Grid Height="805" Width="Auto" Name="mainGrid" KeyUp="Grid_KeyUp_1" Background="#FFF5EFEF" Loaded="mainGrid_Loaded">
        <Label Content="Module 2 View" FontSize="24" Foreground="#FF9C03FC" Height="47" HorizontalAlignment="Left" Margin="174,12,0,0" Name="label1" VerticalAlignment="Top" Width="174" />
        <Label Content="Module 2 View" FontSize="20" Foreground="#FFFF940A" Height="41" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label2" VerticalAlignment="Top" Width="146" FontStyle="Italic" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="496,28,0,0" Name="textBox1" VerticalAlignment="Top" Width="92" />
        <Grid Focusable="True" Margin="0,84,0,457">
                <Button Content="Switch Module" Height="23" IsDefault="True" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="119" IsDefault="True"  Click="button1_Click" />
</Grid>
    </Grid>
</UserControl>

Модуль B - .cs

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        var regionMan = _container.Resolve<IRegionManager>();
        var prevView2 = regionMan.Regions["Main"].GetView("uxMod1");
        regionMan.Regions["Main"].Activate(prevView2);
    }

Надеюсь, это проливает немного света на проблему.

1 Ответ

0 голосов
/ 06 июля 2010

Клавиша «Ввод» запускает события Click в OnKeyDown-событии. Модуль B закрывается при нажатии клавиши Enter, и модуль A снова активируется. Таким образом, родительская форма активируется к тому времени, когда ключ отпущен, и она получает сообщение о ключе.

Другими словами, обрабатывайте клавишу Enter в OnKeyDown, а не OnKeyUp.

(Кстати: клавиша «Пробел» вызывает события Click в OnKeyUp.)

...