В 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>
Изменить Извините, я изменил вопрос, потому что я устранил пользовательский элемент управления в качестве источника проблемы. Это происходит с любым контролем.
Ответы
Ответ 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 сжимает вас до минимального размера. Так что вам, возможно, придется справиться и с этим.