2013-05-07 25 views
5

Tôi đang phát triển một điều khiển tùy chỉnh xuất phát từ Kiểm soát và được xác định bằng ControlTemplate. Sau khi tước bỏ tất cả chuông và còi, các màn hình kiểm soát chỉ có bốn textbox:Làm thế nào để ngăn chặn một điều khiển tùy chỉnh WPF tạo ra với mẫu kiểm soát từ bản vẽ tập trung xung quanh chính nó?

<Style TargetType="{x:Type local:MyControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyControl}"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBox/> 
        <TextBox/> 
        <TextBox/> 
        <TextBox/> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Vấn đề là sự kiểm soát có thể nhận được tập trung bàn phím và vẽ hình chữ nhật tập trung xung quanh bản thân (không phải một trong những textbox, nhưng xung quanh tất cả chúng). Điều này cho biết thêm một điểm dừng tab không cần thiết khi điều hướng thông qua các điều khiển trong cửa sổ.

Đặt tiêu điểm thành sai trên điều khiển tùy chỉnh (sử dụng setter trong kiểu) giải quyết vấn đề, nhưng giải pháp như vậy là hoàn hảo, vì nhà phát triển sử dụng điều khiển đó có thể đặt Focusible thành true. hành vi.

Tôi có thể trả lời sự kiện GotKeyboardFocus của điều khiển và tập trung vào TextBox đầu tiên khi toàn bộ điều khiển nhận được tiêu điểm, nhưng điều này sẽ không hoạt động đúng khi tabbing back (sử dụng Shift + Tab), TextBox đầu tiên sẽ nhận được tiêu điểm trong khi trường hợp như vậy, TextBox cuối cùng nên được tập trung đầu tiên.

Làm cách nào để ngăn toàn bộ kiểm soát tùy chỉnh chấp nhận tiêu điểm bàn phím, nhưng cho phép Hộp văn bản con hoạt động bình thường dưới dạng tab dừng?

+1

Phải cố gắng thiết lập 'FocusVisualStyle' cho 'null'? –

+1

Thật không may nó không hoạt động, nó chỉ đơn giản là ẩn hình chữ nhật lựa chọn mà không thay đổi hành vi, người dùng phải nhấn Tab hai lần để đến TextBox đầu tiên. – RaceRalph

+1

Đặt 'Tập trung' thành' sai' quá. Một số nhà phát triển khác đặt nó trở lại 'true' là vấn đề của họ. Thật vậy, bạn nên ghi đè siêu dữ liệu cho 'FocusableProperty' sao cho nó mặc định là' false' cho điều khiển của bạn. –

Trả lời

0

Tôi sẽ tạo một UserControl thực tế và đóng gói quản lý tập trung ở đó. bởi vì Xaml'ing qua Style chỉ cho phép bạn ...

Đây là mẫu nhanh của UserControl + sử dụng/kiểm tra trong cửa sổ chính. Như bạn sẽ thấy hình chữ nhật tập trung không xuất hiện nữa. Để đơn giản vì tôi không bao gồm DataBindings/ViewModel vv (như' câu hỏi của bạn không phải là về điều đó)

<UserControl x:Class="WpfApplication1.MyControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     IsVisibleChanged="OnIsVisibleChanged" > 
<StackPanel Orientation="Horizontal"> 
    <TextBox x:Name="txtA">txtA</TextBox> 
    <TextBox>txtB</TextBox> 
    <TextBox>txtC</TextBox> 
    <TextBox>txtD</TextBox> 
</StackPanel> 

Set tập trung vào visiblitychanged vào textbox đầu tiên trong mã đằng sau

namespace WpfApplication1 
{ 
public partial class MyControl : UserControl 
{ 
    private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (IsVisible && IsEnabled) 
     { 
      Keyboard.Focus(null); 
      Keyboard.Focus(txtA); 
     } 
    } 

    public MyControl() 
    { 
     InitializeComponent(); 
    } 
} 

}

trong thử nghiệm nhỏ của mình, tôi đặt MyControl giữa hai textbozes khác, khi chỉ chạy tab:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:c="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 

<StackPanel> 
    <TextBox>txt1</TextBox> 
    <c:MyControl/> 
    <TextBox>txt2</TextBox> 
</StackPanel> 

+1

Điều này có vẻ như là một ý tưởng hay! Tôi rất bận và tôi sẽ quay lại câu trả lời của bạn vào tuần tới. – RaceRalph

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