2009-02-23 89 views
19

我在WPF中有一個文本框,它是列表框的數據模板的一部分。在該文本框中,我可以刪除,退格,空格鍵,但我不能輸入新的單詞,字母或數字。我可以從記事本粘貼。爲什麼我的WPF文本框「有點」只讀?

我在這裏錯過了什麼?

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

回答

39

我遇到了與此非常相似的問題。做了一些研究之後,我發現在MSDN中列出了類似的問題:

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

根據答案的帖子,問題與WPF和WinForms有兩個非常不同的處理文本輸入方式做。幸運的是,上面列出的帖子給出了以下解決方案:

啓動窗口時,使用ElementHost.EnableModelessKeyboardInterop(window1)。請注意,這是一個靜態方法 - 您不必實例化ElementHost類。

例如,

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

這解決了這個問題對我來說。希望這可以幫助。

0

我創建了一個簡單的測試應用程序,我可以鍵入新文本到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> 

,我可以在兩者之間看到的唯一區別是ItemTemplate設置在你的列表框中,而另一個不在我的列表框中。什麼是rADetailEntryLayout的XAML?

+0

也許我太WPF小白,但我不明白你的問題。 XAML在數據模板中是正確的,還是我錯過了這個問題? – Russ 2009-02-23 20:26:15

+0

我試着更改爲使用DataType =「{x:Type Entities:RADetailEntry}」而不是命名它,它仍然無法正常工作。 – Russ 2009-02-23 20:27:09

0

首先第一件事情,你有沒有注意到,沒有的ItemTemplate上設置您的項目?其次,爲什麼你要在資源中聲明DataTemplate?你是否願意在ItemTemplate上使用多種類型?如果是這樣的話,你將需要一個DataTemplateSelector,它將爲指定的類型返回一個特定的DataTemplate,否則如果你只需要將模板添加到這個特定的Item中,用ListBox.ItemTemplate替換ListBox.Resources並從dataTemplate中移除該鍵,編譯它,然後你去。

這裏是應該的正常工作:

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

的希望這仍然是因爲從已公佈的問題長時間有用...

0

我也發現了同樣的行爲,但當混合wpf和贏取形式不是。

我做了一個自定義組合框,它可以在一個小測試項目中正常工作,但是當放置在應用程序中時,它不會在點擊時正確獲取鍵盤焦點。

點擊被解僱但立即他們的文本框失去了重點。再次,你可以粘貼東西,但不能正常輸入。

事實證明(好一個Snoop(http://snoopwpf.codeplex.com/)),一個滾動查看器,負載組合框在竊取鍵盤焦點。

標記事件作爲處理停止這種情況的發生,並使其按預期工作:

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