2009-02-23 11 views
19

Tengo un cuadro de texto en WPF que es parte de una plantilla de datos para un cuadro de lista. En ese cuadro de texto, puedo borrar, retroceder, barra espaciadora, pero NO puedo escribir palabras, letras o números nuevos. PUEDO pegar desde el bloc de notas.¿Por qué mi cuadro de texto WPF es "un poco" de solo lectura?

¿Qué me falta aquí?

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

Respuesta

39

Me encontré con un problema muy similar a esto. Después de hacer un poco de investigación, me encontré con un problema similar que aparece en MSDN:

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

De acuerdo con la respuesta al poste, el problema tiene que ver con WPF y Windows Forms que tiene dos formas muy diferentes de controlar las entradas de texto . Afortunadamente, la publicación enumerada arriba ofrece la siguiente solución:

Al iniciar la ventana, use ElementHost.EnableModelessKeyboardInterop (window1). Tenga en cuenta que este es un método estático: no tiene que crear instancias de la clase ElementHost.

Por ejemplo,

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

Esto resolvió el problema para mí. Espero que esto ayude.

+0

Bueno, me gusta su respuesta mejor que la mía. – Russ

+0

Excelente respuesta. Me doy cuenta de que no pareces tan activo, pero he comenzado una recompensa que te recompensaré una vez que pueda. –

+7

Simplemente interviniendo para mencionar otro problema que puede ocurrir cuando tiene WinForms/MFC llamando a WPF y usando 'ElementHost.EnableModelessKeyboardInterop (wpfwindow)'. Si la ventana de WPF abre otra ventana usando 'Window.Show()' entonces el problema del cuadro de texto ocurrirá allí también - cada ventana individual necesita la interoperabilidad no modal habilitada. Tenga en cuenta que 'Window.ShowDialog()' no causa el problema. – Aranda

0

he creado una aplicación sencilla prueba, y puedo escribir nuevo texto en los cuadros de texto en el cuadro de lista:

<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 única diferencia que puedo ver entre los dos es que un ItemTemplate se establece en tu ListBox, y uno no está en el mío. ¿Cuál es el XAML para rADetailEntryLayout?

+0

Tal vez soy demasiado de un novato WPF, pero no siguen su pregunta. El XAML está justo en la plantilla de datos, o ¿me estoy perdiendo la pregunta? – Russ

+0

Intenté cambiar al uso de DataType = "{x: Type Entities: RADetailEntry}" en lugar de nombrarlo, y todavía no funciona correctamente. – Russ

+0

Has especificado tanto una ItemTemplate como una DataTemplate para tu tipo de datos. ItemTemplate se usará automáticamente para todos los elementos en el ListBox. Suponiendo que todos los elementos son del tipo RADetailEntity, no necesita ambos, uno o el otro debería hacerlo. – Andy

0

Lo primero es lo primero, ¿ha notado que no hay ItemTemplate establecido en su ¿Ít? en segundo lugar, ¿por qué ha declarado DataTemplate dentro de un recurso? ¿Estás dispuesto a usar múltiples tipos en ItemTemplate? de ser así, necesitará un DataTemplateSelector, que devolverá un DataTemplate específico para el tipo especificado, de lo contrario, si solo necesita agregar la plantilla a este Elemento específico, reemplace ListBox.Resources con ListBox.ItemTemplate y elimine la clave del dataTemplate, compilarlo y listo.

aquí es como debe ser para que funcione correctamente:

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

espera que esto todavía es ventajosa ya que el largo tiempo de la cuestión han sido escritos ...

0

También encontré el mismo comportamiento pero no cuando se mezclan wpf y formas ganadoras.

Hice un cuadro combinado personalizado que funcionaba bien por sí solo/en un pequeño proyecto de prueba, pero cuando se colocaba en la aplicación no conseguía enfocar el teclado correctamente cuando se hacía clic en él.

Se hizo clic en el clic, pero inmediatamente el cuadro de texto perdió el foco. Nuevamente puedes pegar cosas pero no escribir normalmente.

Resultó (un buen Snoop (http://snoopwpf.codeplex.com/)) que un scrollviewer en el que estaba cargada una caja de combo estaba robando el foco del teclado.

Marcando el evento como se maneja esto ocurra se detuvo e hizo que funcione como se esperaba:

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