Изменение размера окна с меню - PullRequest
0 голосов
/ 25 сентября 2019

Я столкнулся с проблемой создания меню в изменяемом окне.Я сделал тестовое приложение, чтобы продемонстрировать мою проблему ниже:

Я анимирую меню настроек, которое перемещается вниз сверху путем изменения поля сетки.Когда меню настроек перемещается над окном путем изменения поля, если я изменяю высоту окна, я вижу скрытое меню, а не расширение основного экрана (зеленого цвета).

Как я могу изменить его, чтобыОсновная сетка (зеленая) расширяется вместо того, чтобы видеть скрытое меню настроек?

enter image description here

enter image description here

enter image description here

Код:

    <Window x:Class="ResizeTest.MainWindow"
    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"
    xmlns:local="clr-namespace:ResizeTest"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800"
    MinWidth="800"
    MinHeight="450"
    MaxWidth="800"
    MaxHeight="900">

    <Window.Resources>
    <Storyboard x:Key="ShowRightMenu">
        <ThicknessAnimation Storyboard.TargetProperty="Margin"
                            Storyboard.TargetName="gridMenu"
                            From="0, -450, 0, 450"
                            To="0"
                            DecelerationRatio="0.9"
                            Duration="0:0:1" />
    </Storyboard>

    <Storyboard x:Key="HideRightMenu">
        <ThicknessAnimation Storyboard.TargetProperty="Margin"
                            Storyboard.TargetName="gridMenu"
                            From="0"
                            To="0, -450, 0, 450"
                            DecelerationRatio="0.9"
                            Duration="0:0:1" />
    </Storyboard>
    </Window.Resources>

    <Grid>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid Background="Green">
    </Grid>
    <Grid x:Name="gridMenu" Background="Blue"
              Margin="0, -450, 0, 450"
              Grid.Column="1">

        <TextBlock Text="Well hello there!" Foreground="White" FontSize="60" 
    VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>

    <Button HorizontalAlignment="Left" Width="100" Height="50" Margin="10" Content="Clicky Me" 
    Click="Button_Click" />
    </Grid>
    </Window>

1 Ответ

1 голос
/ 25 сентября 2019

Я бы посоветовал вам изменить свойства To и From для ThicknessAnimation, чтобы они соответствовали высоте окна.И дополнительно, что в начале анимации вы устанавливаете Visibility меню на Visible, а в конце Collapsed, если меню не должно быть видно в данный момент.

Для этого япредложил бы добавить поле, содержащее состояние openness меню

private bool menuOpen = false;

, и изменить один из блоков управления в этом

<Storyboard x:Key="MenuStoryboard">
    <ThicknessAnimation Storyboard.TargetProperty="Margin"
                    Storyboard.TargetName="gridMenu"
                    DecelerationRatio="0.9"
                    Duration="0:0:1" />
</Storyboard>

и удалитьпрочее.

Вы также должны убрать поле Grid и добавить Collapsed в качестве значения по умолчанию Visibility

<Grid x:Name="gridMenu" Background="Blue"
      Visibility="Collapsed"
      Grid.Column="1">
    ...
</Grid>

А затем в Click-Event-Handler вы можетеотрегулируйте раскадровку в соответствии с ситуацией и запустите анимацию.

private void Button_Click(object sender, RoutedEventArgs e)
{
    var storyBoard = this.FindResource("ShowRightMenu") as Storyboard;
    var animation = storyBoard.Children[0] as ThicknessAnimation;
    if (menuOpen)
    {
        animation.To = new Thickness(0, -this.Height, 0, Height);
        animation.From = new Thickness(0);
    }
    else
    {
        animation.From = new Thickness(0, -this.Height, 0, this.Height);
        animation.To = new Thickness(0);
    }
    this.gridMenu.Visibility = Visibility.Visible;
    storyBoard.Begin();

    void animationCompleated(object sender2, EventArgs e2)
    {
        if (!menuOpen)
        {
            this.gridMenu.Visibility = Visibility.Collapsed;
        }

        storyBoard.Completed -= animationCompleated;
    }

    storyBoard.Completed += animationCompleated;


    menuOpen = !menuOpen;
}

...