WPF зависает при изменении разрешения экрана или мультиэкранного макета - PullRequest
0 голосов
/ 01 апреля 2020
Приложение

похоже на приложение Sna git, которое всплывает из верхнего края экрана при наведении курсора. Все отлично работает, в том числе анимации и др. c. пока я не изменю разрешение экрана или пока я не работаю в среде с несколькими экранами, меняю расположение экранов. Затем приложение останавливается при первой анимации и меняет цвет фона на цвет, который должен отображаться, когда приложение находится в верхнем положении (убрано). Извините за запутанное описание, я приложил несколько скриншотов и код.

. Net 4.7.2

1-е изображение показывает приложение, как оно должно работать с серым фоном в ползунковом положении при наведении курсора.

2-й изображение показывает испорченное приложение после изменения разрешения или многоэкранного макета - заморожено в ползунковом положении на красном фоне - при наведении курсора проблема будет устранена.

3-е изображение показывает правильный красный цвет приложения в убранном положении.

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

5th gif показывает, как приложение зависает после изменения разрешения, зависание снимает блокировку и приложение снова работает.

This is normal behavior when hover over the window slides down with grey background color

The window freezes in slide down position with color changed to RED

Should be RED only when in UP position - retracted

enter image description here

enter image description here

Раскадровка XAML ниже с анимацией при запуске, при наведении курсора и т. Д. c.

<Window x:Class="DockPanel.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"
    mc:Ignorable="d"
    Icon="DockPanel.ico"
    Title="MainWindow" Name="DockPanel" Height="275" Width="530" 
    Background="Transparent" MouseDown="Window_MouseDown" WindowStyle="None" AllowsTransparency="True"
    WindowStartupLocation="Manual" 
    Top="-241" ShowInTaskbar="False" Topmost="True">

<Window.Resources>

    <!-- Startup animation - when program starts -->
    <Storyboard x:Key="WindowDownStartup">

        <!-- Slide down -->
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0.3" DecelerationRatio="0.8" Duration="0:0:0.4" 
                                       Storyboard.TargetProperty="(Window.Top)" Storyboard.TargetName="DockPanel">

            <EasingDoubleKeyFrame Value="0">

                <EasingDoubleKeyFrame.EasingFunction>
                    <PowerEase Power="4" EasingMode="EaseInOut"/>
                </EasingDoubleKeyFrame.EasingFunction>

            </EasingDoubleKeyFrame>

        </DoubleAnimationUsingKeyFrames>

        <!--Slide up the window-->
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:1.0" DecelerationRatio="0.8" Duration="0:0:0.4" 
                                       Storyboard.TargetProperty="(Window.Top)" Storyboard.TargetName="DockPanel">

            <EasingDoubleKeyFrame Value="-264">

                <EasingDoubleKeyFrame.EasingFunction>
                    <PowerEase Power="2" EasingMode="EaseInOut"/>
                </EasingDoubleKeyFrame.EasingFunction>

            </EasingDoubleKeyFrame>

        </DoubleAnimationUsingKeyFrames>


        <!-- Change color to Red when up -->
        <ColorAnimationUsingKeyFrames BeginTime="0:0:1.5" Storyboard.TargetName="MyApp" 
            Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
            <LinearColorKeyFrame Value="{StaticResource BackgroundRedAnimateUp}" KeyTime="00:00:0.3" />
        </ColorAnimationUsingKeyFrames>
    </Storyboard>


    <!-- Animation when mouse over -->
    <Storyboard x:Key="WindowDown">


        <!-- Change window background color to default when window down -->
        <ColorAnimationUsingKeyFrames BeginTime="0:0:0.3" Storyboard.TargetName="MyApp" 
            Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
            <LinearColorKeyFrame Value="{StaticResource BackgroundDefault}" KeyTime="00:00:0.2" />
        </ColorAnimationUsingKeyFrames>

        <!-- Slide window down to 0 -->
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0.6" Duration="0:0:0.4" DecelerationRatio="0.8"  
                                       Storyboard.TargetProperty="(Window.Top)" Storyboard.TargetName="DockPanel" >

            <EasingDoubleKeyFrame Value="0">

                <EasingDoubleKeyFrame.EasingFunction>
                    <PowerEase Power="3" EasingMode="EaseInOut"/>
                </EasingDoubleKeyFrame.EasingFunction>

            </EasingDoubleKeyFrame>


        </DoubleAnimationUsingKeyFrames>

    </Storyboard>


    <!-- Animation when mouse leave -->
    <Storyboard x:Key="WindowUp" Completed="StoryboardWindowUp_Completed">

        <!-- Slide window up to -219 -->
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0.4" DecelerationRatio="0.8" Duration="0:0:0.4" 
                                       Storyboard.TargetProperty="(Window.Top)" Storyboard.TargetName="DockPanel">

            <EasingDoubleKeyFrame Value="-264">

                <EasingDoubleKeyFrame.EasingFunction>
                    <PowerEase Power="2" EasingMode="EaseInOut"/>
                </EasingDoubleKeyFrame.EasingFunction>

            </EasingDoubleKeyFrame>

        </DoubleAnimationUsingKeyFrames>

        <!-- Change background color to Red after window is up -->
        <ColorAnimationUsingKeyFrames BeginTime="0:0:1.0" Storyboard.TargetName="MyApp" 
            Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
            <LinearColorKeyFrame Value="{StaticResource BackgroundRedAnimateUp}" KeyTime="00:00:0.4" />
        </ColorAnimationUsingKeyFrames>


    </Storyboard>


    <!--Change the window size to 550-->
    <Storyboard x:Key="ExtendWindow">
        <DoubleAnimation BeginTime="0:0:0.3" Duration="00:00:0.3" AccelerationRatio="0.4" DecelerationRatio="0.6" 
                         From="530" To="580" Storyboard.TargetProperty="(Window.Width)" Storyboard.TargetName="DockPanel"/>
    </Storyboard>

    <!--Change the window size back to original size-->
    <Storyboard x:Key="RetractWindow">
        <DoubleAnimation BeginTime="0:0:0.3" Duration="00:00:0.3" AccelerationRatio="0.4" DecelerationRatio="0.6" 
                         From="580" To="530" Storyboard.TargetProperty="(Window.Width)" Storyboard.TargetName="DockPanel"/>
    </Storyboard>


</Window.Resources>


<Window.Triggers>

    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard Storyboard="{StaticResource WindowDownStartup}"/>
    </EventTrigger>
    <EventTrigger RoutedEvent="UIElement.MouseEnter">
        <BeginStoryboard Storyboard="{StaticResource WindowDown}"/>
    </EventTrigger>
    <EventTrigger RoutedEvent="UIElement.MouseLeave">
        <BeginStoryboard Storyboard="{StaticResource WindowUp}"/>
    </EventTrigger>

</Window.Triggers>

Любые идеи высоко ценятся.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Хорошо, я нашел уродливое (временное) решение моей проблемы с помощью обработчика событий DisplaySettingsChaned. Каждый раз, когда обнаруживается изменение разрешения, я перезапускаю приложение. Я признаю, что это не идеальное решение, но оно будет работать, пока я не найду что-то лучшее.

Любые лучшие идеи приветствуются.

SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged);

И через обработчик:

Process.Start(Application.ResourceAssembly.Location);
            Application.Current.Shutdown();
0 голосов
/ 01 апреля 2020

Я не вижу никакой точки, где вы заканчиваете свои раскадровки. Это означает, что все раскадровки все еще работают в фоновом режиме. Попробуйте закрыть окно вверх в начале триггера отпускания мыши, а окно вниз в начале триггера ввода мыши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...