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

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

Пример приложения:

<Window.Resources>
    <Storyboard x:Key="ShrinkSlider" x:Name="ShrinkSlider"
                Completed="ShrinkSlider_Completed">
        <DoubleAnimation
            Storyboard.TargetProperty="Height"
            Storyboard.TargetName="gridSlider"
            DecelerationRatio="0.9"
            From="100"
            To="{Binding ActualHeight, ElementName=gridMain}"
            Duration="00:00:00.5" />
    </Storyboard>

    <Storyboard x:Key="ExpandSlider" x:Name="ExpandSlider"
                Completed="ExpandSlider_Completed">
        <DoubleAnimation
            Storyboard.TargetProperty="Height"
            Storyboard.TargetName="gridSlider"
            DecelerationRatio="0.9"
            From="{Binding ActualHeight, ElementName=gridMain}"
            To="100"
            Duration="00:00:00.5" />
    </Storyboard>
</Window.Resources>

<Window.Triggers>
    <EventTrigger RoutedEvent="ButtonBase.Click"
                  SourceName="btnShrink">
        <BeginStoryboard x:Name="bsbShrinkSlider"
                         Storyboard="{StaticResource ShrinkSlider}" />
    </EventTrigger>

    <EventTrigger RoutedEvent="ButtonBase.Click"
                  SourceName="btnExpand">
        <BeginStoryboard x:Name="bsbExpandSlider"
                         Storyboard="{StaticResource ExpandSlider}" />
    </EventTrigger>
</Window.Triggers>

<Grid x:Name="gridMain">
    <Grid x:Name="gridSlider"
          Background="#1f1f1f"
          VerticalAlignment="Top"
          Height="{Binding ActualHeight, ElementName=gridMain}">
    </Grid>

    <StackPanel VerticalAlignment="Bottom">
        <Button Content="Shrink"
                x:Name="btnShrink"
            Height="20"
                Click="BtnShrink_Click" />
        <Button Content="Expand"
                x:Name="btnExpand"
            Height="20"
                Click="BtnExpand_Click" />
    </StackPanel>
</Grid>
1
David Andrew Thorpe 9 Окт 2019 в 13:24

1 ответ

Лучший ответ

Хорошо, я понял это. Мне нужно было установить Storyboard FillBehaviour = "Stop"

Затем мне нужно было воссоздать привязку к событию Storyboard Completed:

        Binding binding = new Binding();
        binding.Source = gridMain;
        binding.Path = new PropertyPath(Grid.ActualHeightProperty);
        gridSlider.SetBinding(Grid.HeightProperty, binding);

Вот полный измененный код:

Xaml:

<Window.Resources>
    <Storyboard x:Key="ShrinkSlider" x:Name="ShrinkSlider"
                Completed="ShrinkSlider_Completed"
                FillBehavior="Stop">
        <DoubleAnimation
            Storyboard.TargetProperty="Height"
            Storyboard.TargetName="gridSlider"
            DecelerationRatio="0.9"
            From="{Binding ActualHeight, ElementName=gridMain}"
            To="100"
            Duration="00:00:00.5" />
    </Storyboard>

    <Storyboard x:Key="ExpandSlider" x:Name="ExpandSlider"
                Completed="ExpandSlider_Completed"
                FillBehavior="Stop">
        <DoubleAnimation
            Storyboard.TargetProperty="Height"
            Storyboard.TargetName="gridSlider"
            DecelerationRatio="0.9"
            From="100"
            To="{Binding ActualHeight, ElementName=gridMain}"
            Duration="00:00:00.5" />
    </Storyboard>
</Window.Resources>

<Window.Triggers>
    <EventTrigger RoutedEvent="ButtonBase.Click"
                  SourceName="btnShrink">
        <BeginStoryboard x:Name="bsbShrinkSlider"
                         Storyboard="{StaticResource ShrinkSlider}" />
    </EventTrigger>

    <EventTrigger RoutedEvent="ButtonBase.Click"
                  SourceName="btnExpand">
        <BeginStoryboard x:Name="bsbExpandSlider"
                         Storyboard="{StaticResource ExpandSlider}" />
    </EventTrigger>
</Window.Triggers>

<Grid x:Name="gridMain">
    <Grid x:Name="gridSlider"
          Background="#1f1f1f"
          VerticalAlignment="Top"
          Height="{Binding ActualHeight, ElementName=gridMain}">
    </Grid>

    <StackPanel VerticalAlignment="Bottom">
        <Button Content="Shrink"
                x:Name="btnShrink"
            Height="20" />
        <Button Content="Expand"
                x:Name="btnExpand"
            Height="20" />
    </StackPanel>
</Grid>

Cs:

private void ShrinkSlider_Completed(object sender, EventArgs e)
    {
        gridSlider.Height = 100;
    }

    private void ExpandSlider_Completed(object sender, EventArgs e)
    {
        Binding binding = new Binding();
        binding.Source = gridMain;
        binding.Path = new PropertyPath(Grid.ActualHeightProperty);
        gridSlider.SetBinding(Grid.HeightProperty, binding);
    }
1
David Andrew Thorpe 9 Окт 2019 в 11:23