У меня возникли проблемы с решением следующей проблемы.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);
}
Надеюсь, что это пролить немного больше света на проблему.
Некоторые примеры кода были бы полезны, но вы можете посмотреть в перекачиваемых собственности на EventArgs объект, который отправляется на ваш код обработчика событий. – juharr