Trong ứng dụng WPF của tôi, tôi muốn đính kèm một cử chỉ đầu vào vào một lệnh để các cử chỉ đầu vào có sẵn trên toàn cầu trong cửa sổ chính, bất kể điều khiển nào có tiêu điểm. Tuy nhiên, trong trường hợp của tôi, tôi muốn ràng buộc Key.PageDown
với một lệnh, ngay khi các điều khiển nhất định nhận được tiêu điểm (ví dụ: điều khiển TextBox hoặc TreeView), các điều khiển này nhận được các sự kiện quan trọng và lệnh này không còn được kích hoạt nữa. Các điều khiển này không xác định được CommandBindings
hoặc InputBindings
cụ thể.WPF: Làm thế nào để ngăn chặn một điều khiển từ ăn cắp một cử chỉ quan trọng?
Đây là cách tôi định nghĩa cử chỉ đầu vào của tôi:
XAML:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" >
<StackPanel>
<TreeView>
<TreeViewItem Header="1">
<TreeViewItem Header="1.1"></TreeViewItem>
<TreeViewItem Header="1.2"></TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="2" ></TreeViewItem>
</TreeView>
<TextBox />
<Label Name="label1" />
</StackPanel>
</Window>
Code:
using System;
using System.Windows;
using System.Windows.Input;
public static class Commands
{
private static RoutedUICommand _myCommand;
static Commands()
{
_myCommand = new RoutedUICommand("My Command",
"My Command",
typeof(Commands),
new InputGestureCollection()
{
new KeyGesture(Key.PageDown, ModifierKeys.None)
});
}
public static ICommand MyCommand
{
get { return _myCommand; }
}
}
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
CommandBinding cb = new CommandBinding();
cb.Command = Commands.MyCommand;
cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);
cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);
this.CommandBindings.Add(cb);
}
void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
void cb_Executed(object sender, ExecutedRoutedEventArgs e)
{
this.label1.Content = string.Format("My Command was executed {0}", DateTime.Now);
}
}
Tôi đã cố gắng bắt sự kiện của cửa sổ PreviewKeyDown
và đánh dấu nó như là xử lý này có không phải là hiệu ứng mong muốn. Tôi cũng đặt thuộc tính Focusable
thành false
. Điều này đã giúp cho điều khiển TextBox, nhưng không cho TreeView (và có hiệu ứng không mong muốn, rằng TextBox không còn có thể được chỉnh sửa nên nó không phải là một giải pháp cho tôi).
Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể xác định một phím tắt hoạt động ở mọi nơi trong cửa sổ chính?
Bạn cũng có thể muốn kiểm tra bộ sưu tập InputBindings thay vì CommandBindings. Đôi khi bạn sẽ không có RoutedCommand trong CommandBindings ... – Anvaka
Vâng, tôi quên mất điều đó, cảm ơn cho tip :-) –
Đây là một phao cứu sinh. Cảm ơn bạn! – tltjr