Подтвердить что ты не робот

В WPF Stretch элемент управления для заполнения столбца ListView

Как сделать элемент управления заполнением всей ячейки в ListView (с помощью GridView)? Я играл с различными свойствами, но контроль всегда минимальный.

Вот мой xaml.

<Window x:Class="ListViewUserControlTest.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:ListViewUserControlTest"
  Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate x:Key="UserControlCell">
            <Rectangle Fill="Red" HorizontalAlignment="Stretch" MinWidth="10" MinHeight="10" />              
        </DataTemplate>
    </Window.Resources>
    <Grid>        
        <ListView Name="MyListView">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="30" Header="Col1" DisplayMemberBinding="{Binding Name}"  />
                    <GridViewColumn Width="200" Header="Col2" CellTemplate="{StaticResource UserControlCell}"  />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

Изменить Извините, я изменил вопрос, потому что я устранил пользовательский элемент управления в качестве источника проблемы. Это происходит с любым контролем.

4b9b3361

Ответ 1

После сужения моего вопроса я был в Google и нашел ответ здесь.

По какой-то причине элементы ListViewItems устанавливаются влево. Установка их в Stretch устраняет эту проблему. Это делается с помощью такого стиля:

<Style TargetType="ListViewItem">
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>

Это, к сожалению, влияет на каждый столбец, но затем вы можете установить содержимое других столбцов влево, вправо, в центр, как описано в ссылке.

Ответ 2

Другим практически решением является сделать что-то в вашей таблице данных, которая входит в gridviewcolumn

Width="{Binding  RelativeSource={RelativeSource Mode=FindAncestor , AncestorType=ListViewItem, AncestorLevel=1},Path=ActualWidth}">

Это приводит к растягиванию текстового поля по ширине столбца, но правый край обрезается и не отображается. Я еще не исправил эту часть. Таким образом, уже принятый ответ по-прежнему, вероятно, лучший.

Вот пример DataTemplate, который делает это.

<DataTemplate DataType="{x:Type local:EditableStringElement}"
          x:Key="cellSalutation">
<TextBox Text="{Binding _RecipientData._Salutation.Value , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         IsEnabled="{Binding _RecipientData._Salutation.IsEnabled}"
         Width="{Binding  RelativeSource={RelativeSource Mode=FindAncestor , AncestorType=ListViewItem, AncestorLevel=1},Path=ActualWidth}">
</TextBox>

Ответ 3

Пользовательский элемент управления задает значения свойств "Высота" и "Ширина". Ничто не позволяет переопределить свойства, которые вы явно задали. Удалите "Высота" и "Ширина", и контейнер управления сможет испортить размер.

Возможно, вы захотите установить разумные "MinHeight" и "MinWidth", чтобы предотвратить перегрузку контейнеров.

Различные контейнеры делают разные вещи для вашего размера управления; например, Grid расширяет вас, чтобы заполнить ячейку сетки, в которой вы находитесь, в то время как StackPanel сжимает вас до минимального размера. Так что вам, возможно, придется справиться и с этим.