WPF网格行/列大小与DesiredSize的比例?

时间:2010-03-27 09:59:53

标签: wpf xaml

我有两个用户控件垂直排列在网格中,两者都可以扩展到比网格可以容纳的更高。我把它们放在一个功能正常的 scrollviewer 中。我想要的是给他们空间与他们在运行时想要的数量成比例。

因此,如果有500个高度可用,则上部控件需要400而下部600,上部控件将获得200,底部控件将获得200和底部300.

我不知道在设计时每个人想要多少空间与另一个相比,所以使用1 *,2 *等行高不适合我。

我可以手动编写运行时比例大小调整,但是我错过了XAML中的一个简单技巧,可以让我得到我想要的东西吗?

上下文如下(为简洁而修剪)......

<Grid>
    <TabControl>
        <TabItem>
            <Grid>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <GroupBox Grid.Row="0" Header="Title Area" />
                    <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
                        <UserControl />
                    </ScrollViewer>
                    <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
                        <UserControl />
                    </ScrollViewer>
                </Grid> 
            </Grid>
        </TabItem>
    </TabControl>    
</Grid>

1 个答案:

答案 0 :(得分:1)

我会认为在XAML中没有简单的方法,所以我使用代码隐藏。因此,我在XAML中完成它的方式;

<Grid>
    <TabControl>
        <TabItem>
            <Grid>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Name="FooRow" Height="*"/>
                        <RowDefinition Name="BarRow" Height="*"/>
                    </Grid.RowDefinitions>
                    <GroupBox Grid.Row="0" Header="Title Area" />
                    <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
                        <UserControl Name="Foo" SizeChanged="Foo_SizeChanged" />
                    </ScrollViewer>
                    <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
                        <UserControl Name="Bar" SizeChanged="Bar_SizeChanged" />
                    </ScrollViewer>
                </Grid>
            </Grid>
        </TabItem>
    </TabControl>
</Grid>

在代码隐藏中;

    private void Foo_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        FooRow.Height = new GridLength(e.NewSize.Height, GridUnitType.Star);
    }

    private void Bar_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        BarRow.Height = new GridLength(e.NewSize.Height, GridUnitType.Star);
    }

您也可以使用绑定和ValueConverter。