代码之家  ›  专栏  ›  技术社区  ›  Russ

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

  •  19
  • Russ  · 技术社区  · 16 年前

    我在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 回复  |  直到 16 年前
        1
  •  54
  •   Geoff    16 年前

    我遇到了一个与此非常相似的问题。在做了一些研究后,我发现MSDN中列出了一个类似的问题:

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

    启动窗口时,请使用ElementHost.EnableModelessKeyboardInterop(window1)。请注意,这是一个静态方法-您不必实例化ElementHost类。

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

        2
  •  2
  •   JonnyRaa    12 年前

    我也发现了相同的行为,但在混合wpf和win表单时没有发现。

    我制作了一个自定义的组合框,它自己/在一个小测试项目中工作得很好,但是当它被放置在应用程序中时,当它被点击时,它并没有得到正确的键盘焦点。

    点击被触发,但他们的文本框立即失去焦点。同样,您可以粘贴内容,但不能正常键入。

    结果是(很好的一次窥探)( http://snoopwpf.codeplex.com/ ))一堆组合框所在的scrollviewer窃取了键盘焦点。

    将事件标记为已处理可阻止此事件的发生并使其按预期工作:

        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;
        }
    
        3
  •  0
  •   Andy    16 年前

    我创建了一个简单的测试应用程序,可以在列表框的文本框中键入新文本:

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

    ItemTemplate rADetailEntryLayout ?

        4
  •  0
  •   RaduM RaduM    15 年前

    显然,需要在Border元素中添加一个带有x:Name=“PART\u ContentHost”的ScrollViewer元素,请参见以下注释: http://msdn.microsoft.com/en-us/library/ms752068.aspx

        5
  •  0
  •   user150354 user150354    15 年前

    首先,您是否注意到您的项目上没有设置ItemTemplate?第二,为什么要在资源中声明DataTemplate?您愿意在ItemTemplate上使用多种类型吗?如果需要,您将需要一个DataTemplateSelector,它将返回指定类型的特定DataTemplate,否则,如果您只需要将模板添加到此特定项,请将ListBox.Resources替换为ListBox.ItemTemplate,并从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>