Почему мое текстовое поле WPF "вроде" только для чтения? - PullRequest
19 голосов
/ 23 февраля 2009

У меня есть текстовое поле в WPF, которое является частью таблицы данных для списка. В этом текстовом поле я могу удалить, Backspace, пробел, но я не могу вводить новые слова, буквы или цифры. Я могу вставить из блокнота, хотя.

Что мне здесь не хватает?

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

41 голосов
/ 12 марта 2009

Я столкнулся с проблемой, очень похожей на эту. Проведя небольшое исследование, я обнаружил похожую проблему в 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();

Это решило проблему для меня. Надеюсь, это поможет.

0 голосов
/ 01 февраля 2013

Я также обнаружил то же поведение, но не при смешивании форм 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;
    }
0 голосов
/ 04 августа 2009

Перво-наперво, вы заметили, что на вашем Предмете не установлен 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>

Надеюсь, что это все еще полезно, так как долгое время из вопроса были опубликованы ...

0 голосов
/ 13 июля 2009

Очевидно, нужно добавить элемент ScrollViewer с x: Name = "PART_ContentHost" к элементу Border, см. Примечание по адресу: http://msdn.microsoft.com/en-us/library/ms752068.aspx

0 голосов
/ 23 февраля 2009

Я создал простое тестовое приложение и могу вводить новый текст в текстовые поля в 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>

Единственное различие, которое я вижу между этими двумя, заключается в том, что ItemTemplate установлено в вашем ListBox, а одно не в моем. Что такое XAML для rADetailEntryLayout?

...