2010-04-20 4 views
0

У меня возникли проблемы с решением следующей проблемы.WPF Prism Key Event проблема

У меня есть 2 модуля w/views (A & B).

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

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

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

Я боролся с этим в течение 2 дней, поэтому любая помощь будет оценена по достоинству.

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

Модуль А - .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> 

Модуль А - .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); 
    } 

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

+0

Некоторые примеры кода были бы полезны, но вы можете посмотреть в перекачиваемых собственности на EventArgs объект, который отправляется на ваш код обработчика событий. – juharr

ответ

0

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

Другими словами, введите ключ ввода в OnKeyDown, а не OnKeyUp.

(BTW: «Space'-ключ запуска Click-события в OnKeyUp.)