2010-11-18 68 views
8

Tôi đã đặt IsTabStop thành sai trên tất cả các điều khiển trong cửa sổ của mình, do đó khi tôi nhấn phím Tab, tiêu điểm sẽ không di chuyển (tôi cần phím Tab cho mục khác). Nhưng làm điều này phá vỡ phím mũi tên chuyển hướng - Tôi bấm vào một mục trong một ListView và sau đó nhấn lên/xuống không thay đổi mục đã chọn nữa.WPF: Cách tắt điều hướng tab mà không cần tắt điều hướng phím mũi tên?

Có cách nào để tắt điều hướng tab, nhưng không chạm vào điều hướng phím mũi tên? Họ dường như có liên quan.

Tôi đã thử đặt IsTabStop thành true và TabNavigation thành sai, nhưng cũng không hoạt động.

<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> 

Trả lời

14

Trên cửa sổ (hoặc tổ tiên của các điều khiển bạn không muốn tab hoạt động) nuốt phím tab.

Bạn có thể nuốt nó bằng cách gắn vào sự kiện PreviewKeyDown và đặt e.Handled = true khi khóa là một tab.

Mã tinh khiết Đằng sau:

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; 
      } 
     } 
    } 

Bạn cũng có thể thiết lập một handler Keyboard như vậy:

<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> 

nhưng bạn sẽ cần một xử lý sự kiện tương ứng:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 

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

Tốt. Tôi đã gần như làm điều này, nhưng đã được xử lý PreviewKeyUp không PreviewKeyDown vì vậy mặc dù tôi đã thiết lập e.Handled = true nó đã quá muộn bởi điểm đó và tập trung bắn ra một nơi nào đó. – Jon

+0

Điều này cũng ngăn tabbing thông qua các điều khiển trong Tabber đó. – bytecode77

5

tôi tin những gì bạn muốn là đặt KeyboardNavigation.TabNavigation thuộc tính đính kèm vào Sau khi trên ListView của bạn. Tôi đã thực hiện điều này với một ItemsControl được tô khuôn và có vẻ như cho tôi hành vi mà tôi mong đợi từ một ListBox trong đó một tab vào điều khiển sẽ chọn mục đầu tiên nhưng một tab bổ sung sẽ tab ra khỏi hộp danh sách và vào kiểm soát tiếp theo.

Vì vậy, theo phương pháp này, ví dụ của bạn có thể được rút ngắn xuống chỉ với điều này.

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

Tôi chưa thử nghiệm điều này với điều khiển ListView nhưng tôi sẽ không ngạc nhiên nếu nó hoạt động cho bạn.

Các vấn đề liên quan