कुछ इनपुट बाइंडिंग काम करने का कारण है और कुछ ऐसा नहीं है कि टेक्स्टबॉक्स नियंत्रण कुछ महत्वपूर्ण बाइंडिंग को पकड़ता है और संभालता है। उदाहरण के लिए, यह दूसरी ओर आदि पाठ की शुरुआत, अन्य कुंजी संयोजन ऐसे CTRL + रूप F3 के लिए जा रहा के लिए CTRL + वी पेस्ट के लिए, CTRL + होम हैंडल नहीं कर रहे टेक्स्टबॉक्स द्वारा संभाला नहीं जाता है, और इसलिए वे बबल हो जाएंगे।
यदि आप टेक्स्टबॉक्स के इनपुट बाध्यकारी को अक्षम करना चाहते हैं, तो यह आसान होगा - आप ApplicationCommands.NotACommand
कमांड का उपयोग कर सकते हैं, जो डिफ़ॉल्ट व्यवहार को अक्षम कर देगा। उदाहरण के लिए, निम्नलिखित मामले में, साथ CTRL + वी अक्षम कर दिया जाएगा चिपकाने:
<TextBox>
<TextBox.InputBindings>
<KeyBinding Key="V" Modifiers="Control" Command="ApplicationCommands.NotACommand" />
</TextBox.InputBindings>
</TextBox>
हालांकि, उपयोगकर्ता नियंत्रण करने के लिए यह बुलबुला बनाने थोड़ा जटिल काम है। मेरा सुझाव है कि एक संलग्न व्यवहार बनाना है जिसे UserControl पर लागू किया जाएगा, PreviewKeyDown
ईवेंट पर पंजीकरण करें, और टेक्स्टबॉक्स तक पहुंचने से पहले आवश्यकतानुसार इनपुट इनपुट बाइंडिंग निष्पादित करें। इनपुट बाइंडिंग निष्पादित होने पर यह UserControl को प्राथमिकता देगा।
मैं एक बुनियादी व्यवहार है कि इस कार्यक्षमता को प्राप्त होता है आरंभ करने के लिए लिखा है:
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);
}
}
}
}
उपयोग:
<UserControl local:InputBindingsBehavior.TakesInputBindingPrecedence="True">
<UserControl.InputBindings>
<KeyBinding Key="Home" Modifiers="Control" Command="{Binding MyCommand}" />
</UserControl.InputBindings>
<TextBox ... />
</UserControl>
आशा इस मदद करता है।
स्रोत
2012-10-17 21:02:17
टेक्स्टबॉक्स उपयोगकर्ता नियंत्रण के अंदर है? –
@ डीजे बिल्कुल। UserControl कंटेनर है और (इस उदाहरण में) टेक्स्टबॉक्स इसके अंदर है। यह कॉम्बोबॉक्स, डाटाग्रिड इत्यादि के लिए भी काम करता है –