2010-08-10 21 views
5

साथ यह पास नहीं मैं एक पाठ बॉक्स जहां मैं इस राशि मिल गया है: <KeyBinding Command="{Binding MyCommand}" Key="Tab"/>WPF: टैब, स्वैलोज़ टैब के लिए की बाइंडिंग और

समस्या यह टैब निगल है और अगले नियंत्रित करने के लिए टैब नहीं है । मैं टेक्स्टबॉक्स के लिए टैब को कैसे जा सकता हूं और टैब ऑर्डर में टैबबिंग को अगले नियंत्रण में सुरक्षित रख सकता हूं? संपादित करें: मैं एमवीवीएम का उपयोग भी कर रहा हूं और MyCommand ViewModel कोड में है, इसलिए मुझे टैब को फिर से फेंकने की आवश्यकता है।

+1

शायद 'लॉस्टफोकस' ईवेंट आपके उद्देश्यों के लिए अधिक उपयुक्त है? (मैं अभी भी आपके प्रश्न को ब्याज के बारे में समझता हूं, इसलिए +1।) – Heinzi

+0

मैंने लॉस्टफोकस में देखा, लेकिन मेरे संपादन के साथ मैं एमवीवीएम का उपयोग कर रहा हूं, मैं वहां कोड नहीं डालना चाहता हूं। – mike

+0

मैं लॉस्टफोकस के बारे में और सोचता हूं, मैं कमांड को लॉस्टफोकस ईवेंट में कैसे बांध सकता हूं? मैं इसे xaml के कोड में कोड डाले बिना, मेरे व्यूमोडेल में केवल एक कमांड के लिए बाध्यकारी के बिना यह करना चाहता हूं। – mike

उत्तर

0

मुझे आपके प्रश्न को पूरी तरह से एक्सएएमएल समाधान के रूप में दिए गए नियंत्रण पर ध्यान केंद्रित करने का कोई तरीका नहीं मिल रहा है।
मैं एक अटैचमेंट प्रॉपर्टी बनाना चुनता हूं और फिर बाइंडिंग के माध्यम से व्यूमोडेल में अपने कीबाइंडिंग से जुड़े कमांड से अगले नियंत्रण पर फोकस सेट करता हूं।

<Window x:Class="WarpTab.Views.MainView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:c="clr-namespace:WarpTab.Commands" 
    xmlns:Views="clr-namespace:WarpTab.Views" 
    xmlns:local="clr-namespace:WarpTab.ViewModels" 
    Title="Main Window" Height="400" Width="800"> 

    <Window.Resources> 
     <c:CommandReference x:Key="MyCommandReference" Command="{Binding MyCommand}" /> 
    </Window.Resources> 

    <DockPanel> 
    <ScrollViewer> 
     <WrapPanel > 
     <TextBox Text="First text value" > 
      <TextBox.InputBindings> 
       <KeyBinding Command="{StaticResource MyCommandReference}" Key="Tab"/> 
      </TextBox.InputBindings> 
     </TextBox> 
     <TextBox Text="Next text value" local:FocusExtension.IsFocused="{Binding FocusControl}" /> 
     <Button Content="My Button" /> 
     </WrapPanel> 
    </ScrollViewer> 
    </DockPanel> 
</Window> 

यहाँ ViewModel है:

using System.Windows.Input; 
using WarpTab.Commands; 

namespace WarpTab.ViewModels 
{ 
    public class MainViewModel : ViewModelBase 
    { 
    public ICommand MyCommand { get; set; } 
    public MainViewModel() 
    { 
     MyCommand = new DelegateCommand<object>(OnMyCommand, CanMyCommand); 
    } 

    private void OnMyCommand(object obj) 
    { 
     FocusControl = true; 

     // process command here 

     // reset to allow tab to continue to work 
     FocusControl = false; 
     return; 
    } 

    private bool CanMyCommand(object obj) 
    { 
     return true; 
    } 

    private bool _focusControl = false; 
    public bool FocusControl 
    { 
     get 
     { 
     return _focusControl; 
     } 
     set 
     { 
     _focusControl = value; 
     OnPropertyChanged("FocusControl"); 
     } 
    } 
    } 
} 

यहाँ संलग्न संपत्ति है कि मैं निम्नलिखित answer में पाया परिभाषित करने के लिए कोड है

यहां व्यू है।

using System.Windows; 

namespace WarpTab.ViewModels 
{ 
    public static class FocusExtension 
    { 
    public static bool GetIsFocused(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsFocusedProperty); 
    } 

    public static void SetIsFocused(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsFocusedProperty, value); 
    } 

    public static readonly DependencyProperty IsFocusedProperty = 
      DependencyProperty.RegisterAttached(
      "IsFocused", typeof(bool), typeof(FocusExtension), 
      new UIPropertyMetadata(false, OnIsFocusedPropertyChanged)); 

    private static void OnIsFocusedPropertyChanged(DependencyObject d, 
      DependencyPropertyChangedEventArgs e) 
    { 
     var uie = (UIElement)d; 
     if ((bool)e.NewValue) 
     { 
     uie.Focus(); // Don't care about false values. 
     } 
    } 
    } 
} 
0

आप क्यों नहीं बस अपने आदेश हैंडलर में इस कोड का उपयोग नहीं करते हैं?

private void MyCommandHandler(){ 

    // Do command's work here 

    TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next); 
    request.Wrapped = true; 
    control.MoveFocus(request); 

} 

मूल रूप से है यही कारण है कि 'टैब' करता है, इसलिए यदि आप भी ऐसा ही है, तो आप बिल्कुल तैयार हैं। (बेशक दिशा रिवर्स यदि आप Shift-Tab के साथ एक कमांड है।

मैं वास्तव में तो जैसे एक विस्तार विधि में इस लिपटे ...

public static class NavigationHelpers{ 

    public static void MoveFocus(this FrameworkElement control, FocusNavigationDirection direction = FocusNavigationDirection.Next, bool wrap = true) { 

     TraversalRequest request = new TraversalRequest(direction); 
     request.Wrapped = wrap; 
     control.MoveFocus(request); 

    } 

} 

... पहले कोड अर्थ और भी आसान हो जाता है , इस तरह ...

private void MyCommandHandler(){ 

    // Do command's work here 

    Control.MoveFocus(); 

} 

... और यदि आप नहीं जानते कि वर्तमान में ध्यान केंद्रित नियंत्रण है, तो आप सिर्फ यह कर सकते हैं ...

(Keyboard.FocusedElement as FrameworkElement).MoveFocus(); 

उम्मीद है कि यह मदद करता है! यदि ऐसा है, तो अगर आप मुझे वोट देते हैं या स्वीकार किए जाते हैं तो इसे बहुत सराहना की जाती है!

+0

व्यूमोडेल में फोकस करने के लिए कोई फ्रेमवर्क एलिमेंट नहीं है। – Nick

संबंधित मुद्दे