2009-02-23 5 views
19

J'ai une zone de texte dans WPF qui fait partie d'un DataTemplate pour une zone de liste. Dans cette zone de texte, je peux supprimer, retour arrière, barre d'espace, mais je ne peux PAS taper de nouveaux mots, lettres ou chiffres. Je peux coller à partir du bloc-notes si.Pourquoi ma zone de texte WPF est-elle "en lecture seule"?

Qu'est-ce qui me manque ici?

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

Répondre

39

je rencontrais un problème très similaire à cela. Après avoir fait un peu de recherche, j'ai trouvé un problème similaire figurant dans MSDN:

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

Selon la réponse au poste, le problème a à voir avec WPF et WinForms ayant deux façons de gérer la saisie de texte très différents . Heureusement, le poste énuméré ci-dessus donne la solution suivante:

Lors du lancement de la fenêtre, utilisez ElementHost.EnableModelessKeyboardInterop (fenêtre1). Notez qu'il s'agit d'une méthode statique - vous n'avez pas besoin d'instancier la classe ElementHost.

Par exemple,

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

Ce résolu le problème pour moi. J'espère que cela t'aides.

+0

Eh bien, j'aime mieux ta réponse que la mienne. – Russ

+0

Excellente réponse. Je me rends compte que vous ne semblez pas très actif, mais j'ai commencé une générosité que je vais vous donner une fois que je serai capable. –

+7

Juste pour signaler une autre erreur qui peut se produire lorsque vous avez WinForms/MFC appelant WPF et en utilisant 'ElementHost.EnableModelessKeyboardInterop (wpfwindow)'. Si la fenêtre WPF ouvre une autre fenêtre en utilisant 'Window.Show()', alors le problème de la zone de texte se produira là aussi - chaque fenêtre individuelle nécessite l'interopérabilité modérée activée. Notez que 'Window.ShowDialog()' ne provoque pas le problème. – Aranda

0

J'ai créé une application de test simple, et je peux saisir un nouveau texte dans les zones de texte dans la liste:

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

La seule différence que je vois entre les deux est qu'un ItemTemplate est réglé sur votre ListBox, et on n'est pas sur le mien. Quel est le code XAML pour rADetailEntryLayout?

+0

Peut-être que je suis trop d'un noob WPF, mais je ne suivent pas votre question. Le XAML est dans le datatemplate, ou est-ce que je n'ai pas la question? – Russ

+0

J'ai essayé de changer en utilisant DataType = "{x: Type Entities: RADetailEntry}" au lieu de le nommer, et cela ne fonctionne toujours pas correctement. – Russ

+0

Vous avez spécifié à la fois un ItemTemplate et un DataTemplate pour votre type de données. Le ItemTemplate sera automatiquement utilisé pour tous les éléments de la ListBox. En supposant que tous les éléments sont de type RADetailEntity, vous n'avez pas besoin des deux - l'un ou l'autre devrait faire l'affaire. – Andy

0

Tout d'abord, avez-vous remarqué qu'il n'y a pas ItemTemplate mis sur votre Article? Deuxièmement, pourquoi avez-vous déclaré le DataTemplate dans une ressource? êtes-vous prêt à utiliser plusieurs types sur ItemTemplate? Si oui, vous aurez besoin d'un DataTemplateSelector, qui renverra un DataTemplate spécifique pour le type spécifié, sinon si vous avez juste besoin d'ajouter le modèle à cet élément spécifique, remplacer les ListBox.Resources avec ListBox.ItemTemplate et retirer la clé de la datatemplate, compilez-le et là vous allez.

voici comment il devrait être de fonctionner correctement:

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

Espoirs cela est encore UTILE depuis la longue période de la question ont été écrit ...

0

Je trouve aussi le même comportement, mais pas lors du mélange wpf et gagner des formes.

J'ai fait une zone de liste déroulante personnalisée qui fonctionne bien sur son propre/dans un petit projet de test, mais lorsqu'il est placé dans l'application, il était pas obtenir le focus du clavier correctement quand il a été cliqué.

Le clic était tiré mais aussitôt ils textBox perdu le focus. Encore une fois vous pouvez coller des choses mais ne pas taper normalement.

Il s'est avéré (un bon Snoop (http://snoopwpf.codeplex.com/)) qu'un scrollviewer dans lequel se trouvait un chargement de boîtes combo volait le focus du clavier.

Marquer l'événement comme manipulé arrêté ce qui se passe et fait fonctionner comme prévu:

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