为什么我的WPF文本框“有点”只读?

时间:2009-02-23 18:50:29

标签: wpf .net-3.5

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

5 个答案:

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