在具有顶部可调整大小的行的网格中,如何在不移动底行的绝对位置的情况下调整顶行的大小?

时间:2015-05-04 02:47:32

标签: c# wpf

问题:     我有WPF窗口,在高度上设置sizeToContent。它有一个子(网格),后面有行defs:

<Grid.RowDefinitions>
    <RowDefinition Name="QueueHeight" Height="*"/>
    <RowDefinition Height="30"/>
    <RowDefinition Name="PlayedHeight" Height="*"/>
</Grid.RowDefinitions>

第2行是一个静态行,总是30像素并包含主UI。

调整内容行3的大小会导致窗口向下扩展,第2行保持放置 调整内容行1的大小会导致窗口向下扩展,第2行也向下移动。

问题:我该怎么办才能调整第1行的内容,导致第2行停留在同一个地方(类似于第3行)?由于必须使用动画,我不能只使用w.Top = w.Top + resize

尝试解决方案:     动画w.Top属性并向下移动所需的金额。导致非常紧张的动画看起来像狗屎。

编辑:澄清我正在调整内容的大小,而不是行本身。

2 个答案:

答案 0 :(得分:0)

好的,没有任何图片或进一步的描述我不得不对你真正想要的东西做出一些疯狂的假设,所以这可能都是错的。

但是,如果你想要一个元素向上增长,我认为它有一些空间可以增长。所以,我想你有这样的情况:

Window

如果是这种情况,如果您希望使用动画完成增长,可以使用以下XAML实现:请注意,长大的元素不是“底部”网格的一部分,因为您有它(因为它很难让它在网格之外生长)。相反,它与“顶部”网格的底部对齐(当然假设你有一个),并且重叠已经存在的“背景”元素。

嗯,不用多说,这就是XAML。希望它有所帮助(省略了Window元素)。

<Window.Resources>
    <Storyboard x:Key="GrowStoryboard">
        <DoubleAnimation Storyboard.TargetName="TopContent" Storyboard.TargetProperty="Height"
                         To="80" Duration="0:0:1"></DoubleAnimation>
    </Storyboard>
    <Storyboard x:Key="ShrinkStoryboard">
        <DoubleAnimation Storyboard.TargetName="TopContent" Storyboard.TargetProperty="Height"
                         To="25" Duration="0:0:1"></DoubleAnimation>
    </Storyboard>
</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="100"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>

    <Label VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="AliceBlue">
        Top background
    </Label>

    <Label Name="TopContent" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Background="LightYellow" Height="25">
        Top Content
    </Label>

    <Grid Grid.Row="1">
        <Grid.RowDefinitions>
            <RowDefinition Height="30"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Label VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="LightCyan">
            Menu
        </Label>
        <Label Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="MistyRose">
            Content
        </Label>

        <Button Grid.Row="1" Margin="10,30" Content="Grow" VerticalAlignment="Top" HorizontalAlignment="Left">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard Storyboard="{StaticResource GrowStoryboard}"></BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>
        <Button Grid.Row="1" Margin="10,60" Content="Shrink" VerticalAlignment="Top" HorizontalAlignment="Left">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard Storyboard="{StaticResource ShrinkStoryboard}"></BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>
    </Grid>

</Grid>

答案 1 :(得分:0)

我通过简单地使用Popups而不是网格来解决这个问题。他们解决了我的所有问题,并简化了我的代码,因为我之前使用网格做的很多事情都是在弹出窗口中完成的。