我在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>
答案 0 :(得分:41)
我遇到了一个与此非常相似的问题。在做了一些研究后,我发现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();
这解决了我的问题。希望这会有所帮助。
答案 1 :(得分:0)
我创建了一个简单的测试应用程序,我可以在ListBox中的TextBoxes中键入新文本:
<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>
我可以在两者之间看到的唯一区别是你的ListBox上设置了ItemTemplate
,而且我的不在。什么是rADetailEntryLayout
的XAML?
答案 2 :(得分:0)
显然需要将一个带有x:Name =“PART_ContentHost”的ScrollViewer元素添加到Border元素,请参阅以下注释:http://msdn.microsoft.com/en-us/library/ms752068.aspx
答案 3 :(得分: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>
希望这仍然有用,因为问题的长时间已经发布......
答案 4 :(得分:0)
我也发现了相同的行为,但在混合使用wpf和win形式时却没有。
我制作了一个自定义的组合框,它在一个小小的测试项目中可以正常工作,但是当它被放置在应用程序中时,它没有在点击它时正确地获得键盘焦点。
点击被解雇,但随后文字框立即失去焦点。你可以再次粘贴东西但不能正常输入。
原来(很好的一个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;
}