¿Por qué mi cuadro de texto WPF es "un poco" de solo lectura?
.net-3.5 (5)
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.
¿Que me estoy perdiendo aqui?
<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>
Creé una aplicación de prueba simple, y puedo escribir texto nuevo en los cuadros de texto en el 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>
La única diferencia que puedo ver entre los dos es que una ItemTemplate
está configurada en su ListBox, y una no está en la mía. ¿Cuál es el XAML para rADetailEntryLayout
?
Estaba enfrentando un problema muy similar a esto. Después de investigar un poco, encontré un problema similar en MSDN:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c68d5f3c-c8cc-427d-82e3-6135d075a304/
De acuerdo con la respuesta a la publicación, el problema tiene que ver con que WPF y WinForms tienen dos formas muy diferentes de manejar el ingreso de texto. Afortunadamente, la publicación mencionada anteriormente brinda 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ó mi problema. Espero que esto ayude.
Aparentemente, se necesita agregar un elemento ScrollViewer con x: Name = "PART_ContentHost" al elemento Border, consulte la nota en: http://msdn.microsoft.com/en-us/library/ms752068.aspx
Lo primero es lo primero, ¿ha notado que no hay un ItemTemplate establecido en su Artículo? 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 cómo debería ser para funcionar 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 siga siendo útil ya que el largo tiempo de la pregunta se ha publicado ...
También encontré el mismo comportamiento pero no al mezclar wpf y formas de ganar.
Hice un cuadro combinado personalizado que funcionaba bien por sí solo / en un pequeño proyecto de prueba, pero cuando se lo colocaba en la aplicación no se enfocaba correctamente en el teclado cuando se hacía clic en él.
El clic se estaba disparando, pero inmediatamente ellos dejaron de enfocar el cuadro de texto. Nuevamente puedes pegar cosas pero no escribir normalmente.
Resultó (un buen Snoop ( http://snoopwpf.codeplex.com/ )) que un scrollviewer en el que estaban cargados los cuadros combinados estaba robando el foco del teclado.
Marcar el evento como manejado dejó de suceder esto y lo hizo funcionar 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;
}