Стекирование DispatcherTimer — UWP

В настоящее время я работаю над проектом в UWP, и у меня есть CommandBar, который я хочу изменить с Hidden на Compact при перемещении мыши. Через пять секунд (если мышь не двигается) CommandBar должен снова вернуться к Hidden.

Я не получаю никаких ошибок, но когда я перемещаю мышь, CommandBar сходит с ума, и он просто мигает с Hidden на Compact, когда я снова перемещаю мышь. Я думаю, проблема в том, что событие OnMouseMovement накапливается само по себе.

Это мой код для события движения мыши:

public async void OnPointerMoved(object Sender, PointerRoutedEventArgs e)
{
    CmdBar.ClosedDisplayMode = AppBarClosedDisplayMode.Compact;
    DispatcherTimer ButtonTimer = new DispatcherTimer();
    ButtonTimer.Interval = TimeSpan.FromSeconds(5);
    ButtonTimer.Tick += (sender, args) =>
    {
        CmdBar.ClosedDisplayMode = AppBarClosedDisplayMode.Hidden;
    };
    ButtonTimer.Start();
}

person luddep    schedule 23.05.2018    source источник
comment
Ну, вы создаете новый таймер при каждом движении мыши, поэтому есть сотни запущенных таймеров, которые будут устанавливать режим скрытым (а движение мыши делает его компактным и добавляет больше таймеров).   -  person Evk    schedule 23.05.2018
comment
Знаете ли вы какое-либо решение для этого? @Эвк   -  person luddep    schedule 23.05.2018
comment
Не создавайте новый таймер на каждом ходу. Вместо этого используйте один таймер и сбрасывайте его каждый раз, когда мышь перемещается. Также не забудьте остановить этот таймер, когда он тикает, иначе он будет тикать каждые 5 секунд, а вам нужно только один раз.   -  person Evk    schedule 23.05.2018


Ответы (1)


Я сделал небольшой тестовый проект, чтобы попробовать и получить ответ, вот что я сделал:

private DispatcherTimer Timer { get; set; }
public MainPage()
{
    this.InitializeComponent();
    CmdBar.ClosedDisplayMode = AppBarClosedDisplayMode.Hidden;            
    Timer = new DispatcherTimer(){Interval = TimeSpan.FromSeconds(5) };
    Timer.Tick += (sender, args) => { 
        CmdBar.ClosedDisplayMode = AppBarClosedDisplayMode.Hidden; 
        Timer.Stop();
    };

}

public async void OnPointerMoved(object Sender, PointerRoutedEventArgs e)
{
    Timer.Stop();
    CmdBar.ClosedDisplayMode = AppBarClosedDisplayMode.Compact;
    Timer.Start();            
}

По сути, как сказал @Evk, вы создаете новый таймер при каждом движении мыши. Поэтому я объявил свойство для таймера и остановил его, а затем перезапустил при движении мыши.

person Antoine Thiry    schedule 23.05.2018
comment
Стоит также остановить таймер внутри Tick, иначе он будет тикать каждые 5 секунд без всякой причины. - person Evk; 23.05.2018
comment
Окей, спасибо :) @Evk - person luddep; 23.05.2018
comment
@Evk Спасибо, не подумал об этом, я отредактировал ответ - person Antoine Thiry; 23.05.2018
comment
@luddep Не забудьте отметить это как ответ, если он решил вашу проблему. Спасибо ! - person Antoine Thiry; 23.05.2018
comment
@AntoineThity Ой, извини, забыл :D - person luddep; 23.05.2018
comment
@AntoineThiry Спасибо :) - person luddep; 23.05.2018