Почему привязка команд в ToggleButton не распознает ввод с сенсорного экрана? - PullRequest
0 голосов
/ 04 ноября 2019

Платформа и приложение: я использую шаблон MVVM в приложении WPF. Приложение после развертывания будет доступно только через сенсорный экран. Как показывает шаблон mvvm, я использовал привязки команд к ICommands и прикрепил RelayCommands.

  <ToggleButton Grid.Row="1" 
          Padding="5 4 4 4"
          Command="{Binding HomeCommand}" 
          IsChecked="{Binding isCheckedHomeButton, Mode=TwoWay}"
          Style="{StaticResource SideMenuToggleButton}" 
          Content="{StaticResource FontAwesomeIconHome}"/>

Проблема: Если кнопка нажата или нажата в начале, RelayCommands сработают и будут выполнены правильно. Через некоторое время (обычно 2 минуты) приложение все еще распознает, была ли нажата кнопка, но не распознает, была ли нажата кнопка.

Что я тестировал до сих пор: Windows Application EventLog не имеет связанных записей.

Я добавил обработчики событий, несмотря на шаблон MVVM Command, чтобы обеспечить правильное срабатывание событий TouchDown. Приложение правильно отреагировало на все подключенные сенсорные входы.

PS C:\Temp\DebugLog> Get-Content .\testLog.txt -Wait
MouseClickDetected --- 30.10.2019 13:00:20
MouseClickDetected --- 30.10.2019 13:01:10
MouseClickDetected --- 30.10.2019 13:01:11
MouseClickDetected --- 30.10.2019 13:01:11
MouseClickDetected --- 30.10.2019 13:01:11
TOUCHDOWN Detected --- 30.10.2019 13:11:51
TOUCHDOWN Detected --- 30.10.2019 13:11:51
TOUCHDOWN Detected --- 30.10.2019 13:11:52
TOUCHDOWN Detected --- 30.10.2019 13:11:52
TOUCHDOWN Detected --- 30.10.2019 13:11:52
TOUCHDOWN Detected --- 30.10.2019 13:11:52

Таким образом, проблема возникает только с привязкой команд.

Как я могу выяснить, почему связанные команды не запускаются касанием? Повезло ли вам, что сенсорные входы сработали в первую очередь?

1 Ответ

0 голосов
/ 04 ноября 2019

Я столкнулся с подобной проблемой некоторое время назад. Я пока не могу воспроизвести вашу проблему, но вот совет. Попробуйте использовать «PreviewMouseDown» вместо «IsChechked» и просто добавьте обработчик событий примерно так:

 private void ToggleButton_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (yourToggleButton.IsChecked == true)
        {
            //uncheck task
            yourToggleButton.IsChecked = false;

        }
        else
        {
            //check task
            yourToggleButton.IsChecked = true;
        }
    }

Я знаю, это не самый изощренный способ сделать это, но у ToggleButton есть некоторые проблемы, я предоставлю более правильную информацию позже (если вы предпочитаете). PreviewMouseDown (или Up, как вам удобнее) должен правильно обрабатывать сенсорные события.

...