WPF: كيفية تعطيل التنقل في علامة التبويب دون تعطيل الملاحة الرئيسية للسهم؟

StackOverflow https://stackoverflow.com/questions/4210659

  •  25-09-2019
  •  | 
  •  

سؤال

لقد وضع IsTabStop إلى خطأ في جميع عناصر التحكم في نافذتي ، بحيث عندما أضغط على مفتاح علامة التبويب ، لا يتحرك التركيز (أحتاج إلى مفتاح علامة التبويب لشيء آخر). لكن القيام بذلك يعطل الملاحة مفتاح السهم - أنقر على عنصر في أ ListView ثم الضغط لأعلى/لأسفل لا يغير العنصر المحدد بعد الآن.

هل هناك طريقة لتعطيل التنقل في علامة التبويب ، ولكن دون لمس الملاحة الرئيسية للسهم؟ يبدو أنها مرتبطة.

حاولت الإعداد IsTabStop إلى صحيح و TabNavigation إلى خطأ ، لكنه لا يعمل أيضًا.

<ListView ItemContainerStyle="{StaticResource ItemCommon}" IsTabStop="False">
    <ListView.Resources>
        <Style x:Key="ItemCommon">
            <Setter Property="IsTabStop" Value="False"/>
            <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
            <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle"/>
        </Style>
    </ListView.Resources>
</ListView>
هل كانت مفيدة؟

المحلول

على نافذتك (أو بعض أسلاف عناصر التحكم التي لا تريد أن تعمل عليها علامة التبويب) ابتلع مفتاح علامة التبويب.

يمكنك ابتلاعه عن طريق إرفاقه بحدث PreviewKeyDown وتعيين e.handled = true عندما يكون المفتاح علامة تبويب.

الكود الخالص وراء:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.PreviewKeyDown += MainWindowPreviewKeyDown;
        }

        static void MainWindowPreviewKeyDown(object sender, KeyEventArgs e)
        {
            if(e.Key == Key.Tab)
            {
                e.Handled = true;
            }
        }
    }

يمكنك أيضًا تعيين معالج لوحة المفاتيح على هذا النحو:

<Window x:Class="TabSwallowTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Keyboard.PreviewKeyDown="Window_PreviewKeyDown" >

    <StackPanel>
        <TextBox Width="200" Margin="10"></TextBox>
        <TextBox Width="200" Margin="10"></TextBox>
    </StackPanel>
</Window>

لكنك ستحتاج إلى معالج أحداث مقابل:

   private void Window_PreviewKeyDown(object sender, KeyEventArgs e)

    {
        if (e.Key == Key.Tab)
        {
            e.Handled = true;
        }
    }

نصائح أخرى

أعتقد أن ما تريده هو ضبط لوحة المفاتيح خاصية مرفقة مرة واحدة على ListView الخاص بك. لقد قمت بذلك باستخدام ustemscontrol templated ويبدو أنه يعطيني السلوك الذي أتوقعه من مربع القائمة حيث ستحدد علامة تبويب في عنصر التحكم العنصر الأول ولكن علامة تبويب إضافية ستقوم بعلامة تبويب مباشرة من صندوق القائمة وعلى السيطرة التالية.

لذلك ، قد يكون متابعة هذه الطريقة مثالك قادرًا على التقصير إلى هذا الأمر فقط.

<ListView ItemContainerStyle="{StaticResource ItemCommon}"
          KeyboardNavigation.TabNavigation="Once" />

لم أختبر هذا مع التحكم في ListView ، لكنني لن أفاجأ إذا كان يعمل من أجلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top