0

我有一个自定义控件,它有两个使用 GridViewRowPresenters 的 listViews。我需要两个 listViews 的行高相同。问题是在运行时间之前我不知道高度会是多少。

也就是说,两者的高度都将设置为 Auto,并且在呈现控件时,一个 listView 的行将在 ActualHeight = 30 处,另一个在 ActualHeight = 40 处。我希望它们都是 40。

4

1 回答 1

0

如果 ListViews 使用共享项目模板,您只需将 GridViewRowPresenter 包装在网格中,然后在该网格的唯一行上使用 SharedSizeGroup。这是如何实现的。

XAML

<UserControl x:Class="WpfApplication1.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             d:DesignHeight="300"
             d:DesignWidth="300"
             mc:Ignorable="d">
    <UserControl.Resources>
        <GridViewColumnCollection x:Key="GridViewColumns">
            <GridViewColumn Width="100"
                            DisplayMemberBinding="{Binding Path=Text}"
                            Header="Text" />
        </GridViewColumnCollection>
        <DataTemplate x:Key="RowTemplate">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" SharedSizeGroup="RowSizeGroup" />
                </Grid.RowDefinitions>
                <Border BorderBrush="Black" BorderThickness="1">
                    <GridViewRowPresenter Columns="{StaticResource GridViewColumns}" />
                </Border>
            </Grid>
        </DataTemplate>
    </UserControl.Resources>
    <Grid IsSharedSizeScope="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <GridViewHeaderRowPresenter Columns="{StaticResource GridViewColumns}" />
        <ListView Grid.Row="1"
                  ItemTemplate="{StaticResource RowTemplate}"
                  ItemsSource="{Binding Path=Items1}" />
        <ListView Grid.Row="2"
                  ItemTemplate="{StaticResource RowTemplate}"
                  ItemsSource="{Binding Path=Items2}" />
    </Grid>
</UserControl>

代码隐藏(供参考,但不是很重要)

using System.Collections.ObjectModel;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for UserControl2.xaml
    /// </summary>
    public partial class UserControl2
    {
        public UserControl2()
        {
            InitializeComponent();
            DataContext = this;
            Items1 = new ObservableCollection<object>
                {
                    new Item {Text = "Hello World!"},
                    new Item {Text = "Hello \nWorld!"}
                };
            Items2 = new ObservableCollection<object>
                {
                    new Item {Text = "Testing 1\n2\n3"}
                };
        }

        private class Item
        {
            public string Text { get; set; }
        }

        public ObservableCollection<object> Items1 { get; private set; }

        public ObservableCollection<object> Items2 { get; private set; }
    }
}

如果要明确设置行的高度,只需替换<RowDefinition Height="Auto" SharedSizeGroup="RowSizeGroup" /><RowDefinition Height="40" SharedSizeGroup="RowSizeGroup" />40 在这种情况下是特定高度。

于 2013-02-08T06:04:24.207 回答