Lý do một số kết buộc đầu vào hoạt động và một số không phải là điều khiển TextBox bắt và xử lý một số ràng buộc chính. Ví dụ, nó xử lý CTRL +V cho dán, CTRL +Home cho đi đến đầu văn bản, vv tổ hợp phím khác như CTRL +F3 mặt khác aren 't xử lý bởi TextBox, và vì vậy họ sẽ bong bóng lên.
Nếu bạn chỉ muốn vô hiệu hóa ràng buộc đầu vào của TextBox, điều đó sẽ đơn giản - bạn có thể sử dụng lệnh ApplicationCommands.NotACommand
, điều này sẽ vô hiệu hóa hành vi mặc định. Ví dụ, trong trường hợp sau đây, dán với CTRL +V sẽ bị vô hiệu:
<TextBox>
<TextBox.InputBindings>
<KeyBinding Key="V" Modifiers="Control" Command="ApplicationCommands.NotACommand" />
</TextBox.InputBindings>
</TextBox>
Tuy nhiên, làm cho nó bong bóng lên đến điều khiển người dùng là một chút phức tạp hơn. Đề xuất của tôi là tạo một hành vi đính kèm sẽ được áp dụng cho UserControl, đăng ký sự kiện PreviewKeyDown
và thực thi các ràng buộc đầu vào của nó khi cần thiết trước khi chúng đến được TextBox. Điều này sẽ ưu tiên cho UserControl khi các ràng buộc đầu vào được thực hiện.
Tôi đã viết một hành vi cơ bản mà đạt được chức năng này để giúp bạn bắt đầu:
public class InputBindingsBehavior
{
public static readonly DependencyProperty TakesInputBindingPrecedenceProperty =
DependencyProperty.RegisterAttached("TakesInputBindingPrecedence", typeof(bool), typeof(InputBindingsBehavior), new UIPropertyMetadata(false, OnTakesInputBindingPrecedenceChanged));
public static bool GetTakesInputBindingPrecedence(UIElement obj)
{
return (bool)obj.GetValue(TakesInputBindingPrecedenceProperty);
}
public static void SetTakesInputBindingPrecedence(UIElement obj, bool value)
{
obj.SetValue(TakesInputBindingPrecedenceProperty, value);
}
private static void OnTakesInputBindingPrecedenceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((UIElement)d).PreviewKeyDown += new KeyEventHandler(InputBindingsBehavior_PreviewKeyDown);
}
private static void InputBindingsBehavior_PreviewKeyDown(object sender, KeyEventArgs e)
{
var uielement = (UIElement)sender;
var foundBinding = uielement.InputBindings
.OfType<KeyBinding>()
.FirstOrDefault(kb => kb.Key == e.Key && kb.Modifiers == e.KeyboardDevice.Modifiers);
if (foundBinding != null)
{
e.Handled = true;
if (foundBinding.Command.CanExecute(foundBinding.CommandParameter))
{
foundBinding.Command.Execute(foundBinding.CommandParameter);
}
}
}
}
Cách sử dụng:
<UserControl local:InputBindingsBehavior.TakesInputBindingPrecedence="True">
<UserControl.InputBindings>
<KeyBinding Key="Home" Modifiers="Control" Command="{Binding MyCommand}" />
</UserControl.InputBindings>
<TextBox ... />
</UserControl>
Hope this helps.
Nguồn
2012-10-17 21:02:17
hộp văn bản nằm trong bảng điều khiển người dùng? –
@DJ chính xác. Các UserControl là container và (trong ví dụ này) một TextBox là bên trong nó. Nó cũng hoạt động cho ComboBox, DataGrid, vv –