2009-02-23 13 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

私はこれに非常に似た問題に遭遇しました。ポストへの回答によると、問題はWPFとテキスト入力を処理する2つの非常に異なる方法を持つのWinFormsと関係してい

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

:少し研究を行った後、私は、MSDNに記載されている同様の問題を発見しました。幸運なことに、上記のポストは以下の解決策を提供します:

ウィンドウを起動するときは、ElementHost.EnableModelessKeyboardInterop(window1)を使用してください。これは静的メソッドであり、ElementHostクラスをインスタンス化する必要はありません。例えば

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

これは私のために問題を解決しました。お役に立てれば。どうやら1は、xとScrollViewerの要素を追加する必要が

+0

まあ、あなたの答えは私のものよりも好きです。 – Russ

+0

優れた答え。私はあなたがすべての活気にあふれているとは思わないが、私はできるだけ賞金を授与し始めた。 –

+7

WinForms/MFCでWPFを呼び出し、 'ElementHost.EnableModelessKeyboardInterop(wpfwindow)'を使用しているときに発生する可能性があるもう一つの問題点については、 WPFウィンドウが 'Window.Show()'を使って別のウィンドウを開くと、テキストボックスの問題も発生します - 個々のウィンドウにはモードレスinteropが有効になっている必要があります。 'Window.ShowDialog()'は問題を引き起こさないことに注意してください。 – Aranda

0

私は簡単なテストアプリケーションを作成し、私はリストボックスでのTextBoxに新しいテキストを入力することができます

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

私は2つの間で見ることができる唯一の違いはItemTemplateが設定されていることですあなたのリストボックスに、そして1つは私のものではありません。 rADetailEntryLayoutのXAMLとは何ですか?

+0

たぶん私はWPFのnoobのが多すぎるが、私はあなたの質問に従いません。 XAMLはデータ型の中にありますか、それとも質問はありませんか? – Russ

+0

名前を付ける代わりにDataType = "{x:Type Entities:RADetailEntry}"を使用しようとしましたが、それでも正しく動作しません。 – Russ

+0

データ型にItemTemplateとDataTemplateの両方を指定しました。 ItemTemplateはListBox内のすべての項目に自動的に使用されます。すべてのアイテムがRADetailEntityタイプであると仮定すると、どちらか一方が行う必要があります。 – Andy

0

まず、物事、あなたはにはItemTemplateに設定されていないことに気づきました項目?第二に、なぜあなたはリソース内でDataTemplateを宣言しましたか? ItemTemplateで複数の型を使用したいですか?そうでなければ、指定した型の特定のDataTemplateを返すDataTemplateSelectorが必要です。そうでない場合は、この特定のItemにテンプレートを追加するだけで、ListBox.ResourcesをListBox.ItemTemplateに置き換え、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とwinのフォームを混在させるときではありません。

小さなテストプロジェクトではうまく動作するカスタムコンボボックスを作ったが、アプリケーションに配置するとクリックしたときにキーボードのフォーカスが適切に得られなかった。

クリックが中断されましたが、すぐにテキストボックスのフォーカスが失われました。もう一度、物事を貼り付けることができますが、通常はタイプしません。

コンボボックスの読み込み中のスクロールビューアーがキーボードフォーカスを盗んでいたことが判明しました(すばらしいスヌープ(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; 
    } 
関連する問題