2009-02-23 26 views
19

Tôi có một hộp văn bản trong WPF là một phần của biểu dữ liệu cho hộp danh sách. Trong hộp văn bản đó tôi có thể xóa, backspace, spacebar, nhưng tôi KHÔNG thể gõ từ mới, chữ cái hoặc số. Tôi có thể dán từ notepad mặc dù.Tại sao hộp văn bản WPF của tôi "kinda" chỉ đọc?

Tôi thiếu gì ở đây?

<ListBox Grid.Column="1" 
     ItemsSource="{Binding Details}" 
     VirtualizingStackPanel.VirtualizationMode="Recycling" 
     HorizontalContentAlignment="Stretch" > 
      <ListBox.Resources> 
       <DataTemplate DataType="{x:Type Entities:RADetailEntry}"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="*"/> 
         </Grid.ColumnDefinitions> 

         <ComboBox Grid.Column="0" /> 
         <TextBox Grid.Column="1" IsReadOnly="False" IsEnabled="True" 
           Text="{Binding Path=Description, Mode=TwoWay}" TextWrapping="Wrap" 
           HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextAlignment="Left" /> 
        </Grid> 
       </DataTemplate> 
      </ListBox.Resources> 
     </ListBox> 

Trả lời

39

Tôi đã gặp phải sự cố rất giống với vấn đề này. Sau khi thực hiện một nghiên cứu nhỏ, tôi tìm thấy một vấn đề tương tự được liệt kê trong MSDN:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c68d5f3c-c8cc-427d-82e3-6135d075a304/

Theo câu trả lời cho các bài, các vấn đề đã làm với WPF và WinForms có hai cách rất khác nhau xử lý nhập văn bản . May mắn thay, bài đăng được liệt kê ở trên cung cấp giải pháp sau:

Khi khởi chạy cửa sổ, hãy sử dụng ElementHost.EnableModelessKeyboardInterop (window1). Lưu ý rằng đây là một phương thức tĩnh - bạn không phải khởi tạo lớp ElementHost.

Ví dụ,

Window window1 = new Window(); 
ElementHost.EnableModelessKeyboardInterop(window1); 
window1.Show(); 

này đã giải quyết được vấn đề đối với tôi. Hi vọng điêu nay co ich.

+0

Vâng, tôi thích câu trả lời của bạn tốt hơn tôi. – Russ

+0

Câu trả lời hay. Tôi nhận ra bạn dường như không có tất cả những hoạt động, nhưng tôi đã bắt đầu một tiền thưởng mà tôi sẽ trao cho bạn khi tôi có thể. –

+7

Chỉ cần chú ý đến một chú thích khác có thể xảy ra khi bạn có WinForms/MFC gọi WPF và sử dụng 'ElementHost.EnableModelessKeyboardInterop (wpfwindow)'. Nếu cửa sổ WPF mở một cửa sổ khác bằng cách sử dụng 'Window.Show()' thì vấn đề hộp văn bản cũng sẽ xuất hiện ở đó - mỗi cửa sổ riêng lẻ cần kích hoạt interop vô ích. Lưu ý rằng 'Window.ShowDialog()' không gây ra vấn đề. – Aranda

0

Tôi tạo ra một ứng dụng thử nghiệm đơn giản, và tôi có thể gõ văn bản mới vào textbox trong ListBox:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:app="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300"> 
    <ListBox ItemsSource="{Binding Details}" 
     HorizontalAlignment="Stretch" 
     VirtualizingStackPanel.VirtualizationMode="Recycling"> 
     <ListBox.Resources> 
      <DataTemplate DataType="{x:Type app:Data}"> 
       <StackPanel Orientation="Horizontal"> 
        <ComboBox /> 
        <TextBox SpellCheck.IsEnabled="True" TextWrapping="Wrap" 
         HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
         Text="{Binding Path=Text, Mode=TwoWay}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.Resources> 
    </ListBox> 
</Window> 

Sự khác biệt duy nhất mà tôi có thể thấy giữa hai là một ItemTemplate được thiết lập trên ListBox của bạn và một hộp không thuộc về tôi. XAML cho rADetailEntryLayout là gì?

+0

Có lẽ tôi quá nhiều của một Noob WPF, nhưng tôi không làm theo câu hỏi của bạn. XAML là đúng trong datatemplate, hoặc tôi thiếu câu hỏi? – Russ

+0

Tôi đã thử thay đổi để sử dụng DataType = "{x: Loại đối tượng: RADetailEntry}" thay vì đặt tên cho nó và nó vẫn không hoạt động chính xác. – Russ

+0

Bạn đã chỉ định cả một ItemTemplate và một DataTemplate cho kiểu dữ liệu của bạn. ItemTemplate sẽ tự động được sử dụng cho tất cả các mục trong ListBox. Giả sử tất cả các mục đều thuộc loại RADetailEntity, bạn không cần cả hai - cái này hay cái kia nên làm. – Andy

0

Trước tiên, có bạn nhận thấy rằng không có ItemTemplate đặt trên của bạn Mục? thứ hai, tại sao bạn đã khai báo DataTemplate bên trong một tài nguyên? bạn có sẵn sàng sử dụng nhiều loại trên ItemTemplate không? nếu như vậy bạn sẽ cần một DataTemplateSelector, sẽ trả về một DataTemplate cụ thể cho kiểu được chỉ định, nếu bạn chỉ cần thêm mẫu vào khoản cụ thể này, hãy thay thế ListBox.Resources bằng ListBox.ItemTemplate và loại bỏ khóa khỏi dataTemplate, biên dịch nó và ở đó bạn đi.

đây là cách nó phải được làm việc đúng cách:

<ListBox Grid.Column="1" ItemsSource="{Binding Path=Details}" VirtualizingStackPanel.VirtualizationMode="Recycling" HorizontalContentAlignment="Stretch" > 
     <!-- Remove this <ListBox.Resources> --> 
     <!-- Add this --> 
     <ListBox.ItemTemplate> 
      <!-- Remove this <DataTemplate DataType="{x:Type Entities:RADetailEntry}"> --> 
      <!-- Add this --> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
        <ComboBox Grid.Column="0" /> 
        <TextBox Grid.Column="1" IsReadOnly="False" IsEnabled="True" 
         Text="{Binding Path=Description, Mode=TwoWay}" TextWrapping="Wrap" 
         HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextAlignment="Left" 
         /> 
       </Grid> 
      </DataTemplate> 
     <!-- Remove this </ListBox.Resources> --> 
     <!-- Add this --> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Hy vọng này vẫn hữu ích kể từ thời gian dài từ các câu hỏi đã được đăng ...

0

Tôi cũng thấy hành vi tương tự nhưng không phải khi trộn wpf và giành các hình thức.

Tôi đã tạo hộp tổ hợp tùy chỉnh hoạt động tốt/trong một dự án thử nghiệm nhỏ nhưng khi được đặt trong ứng dụng, nó không được lấy tiêu điểm bàn phím chính xác khi được nhấp vào.

Nhấp chuột đã được kích hoạt nhưng sau đó ngay lập tức hộp văn bản bị mất tiêu điểm. Một lần nữa bạn có thể dán mọi thứ vào nhưng không gõ bình thường.

Nó bật ra (tốt nhất một Snoop (http://snoopwpf.codeplex.com/)) mà một scrollviewer rằng tải trọng của hộp tổ hợp đã được lấy cắp tập trung bàn phím.

đánh dấu sự kiện này như xử lý dừng lại xảy ra điều này và làm cho nó hoạt động như mong đợi:

private void ClickOnStack(object sender, MouseButtonEventArgs e) 
    { 
     //do other stuff with click 
     _textBox.Focus(); 

     //note this is key to stop things like scrollviewers nicking focus 
     e.Handled = true; 
    } 
Các vấn đề liên quan