Сбой приложения WPF .NET, события ComboBox и Menu не запускаются на планшетах с Windows 10 Creators Update, .NET 4.7 или KB4034658

Когда я трясусь/нервничаю/стучу пером по ComboBox, нажимаю на элементы, перемещаю перо, нажимая... через 5 или 10 минут элемент управления перестает работать.
Затем я могу открыть ComboBox, могу щелкнуть на элементе элемент выделяется, но ничего не происходит: ComboBox не закрывается, и событие щелчка не запускается.
Та же ошибка возникает с ContextMenu. И когда возникает ошибка, все ComboBox и все меню больше не работают. Это происходит, когда я нажимаю пером или пальцем, мышь работает нормально, даже если элементы управления больше не могут использоваться пером или пальцем.

При обычном использовании это происходит примерно 5 раз в рабочий день, что очень раздражает моих пользователей. Вам нужно немного «терпения», чтобы воспроизвести ошибку, может быть, это займет у вас более 10 минут ... но это ДЕЙСТВИТЕЛЬНО происходит.

Я сделал простое тестовое приложение с одним ComboBox и одной кнопкой с ContextMenu, с его помощью вы можете воспроизвести ошибку.
Целевая структура моего приложения — 4.6.1, скомпилированная с помощью VS2015. Мое приложение отлично работает с Windows 8.1 и Windows 10 Anniversary, с .NET 4.6.1 и 4.6.2.

Ошибка возникает на Microsoft Surface Pro 3 и Pro 4 с
- Windows 10 Creators Update (включая .NET 4.7)
- Windows 10 Anniversary Update и .NET 4.7 установлены
- Windows 8.1 и .NET 4.7 установлены.
- Установлено юбилейное обновление Windows 10 (.NET 4.6.2) и KB4034658 !!!

Для первых трех сценариев я узнал, как заблокировать установку Creators Update и .NET 4.7 Центром обновления Windows, по крайней мере, в течение следующих 6 месяцев. мои пользователи с Windows 10 должны либо жить с ошибками, либо полностью деактивировать все обновления Windows.

Вот код моего тестового приложения:

MainWindow.xaml:

<Window x:Class="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:DotNet47ComboBoxAndMenuError"
        mc:Ignorable="d"
        Title="" Height="900" Width="715" WindowStartupLocation="Manual" WindowState="Maximized">
    <Grid>
        <WrapPanel>
            <ComboBox FontSize="16" Width="150">
                <ComboBoxItem>ComboBoxItem 1</ComboBoxItem>
                <ComboBoxItem>ComboBoxItem 2</ComboBoxItem>
                <ComboBoxItem>ComboBoxItem 3</ComboBoxItem>
                <ComboBoxItem>ComboBoxItem 4</ComboBoxItem>
                <ComboBoxItem>ComboBoxItem 5</ComboBoxItem>
                <ComboBoxItem>ComboBoxItem 6</ComboBoxItem>
                <ComboBoxItem>ComboBoxItem 7</ComboBoxItem>
                <ComboBoxItem>ComboBoxItem 8</ComboBoxItem>
                <ComboBoxItem>ComboBoxItem 9</ComboBoxItem>
            </ComboBox>
            <Button x:Name="btnMenu" Content="MENU" FontSize="16" Margin="100,0,0,0">
                <Button.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="MenuItem 1"></MenuItem>
                        <MenuItem Header="MenuItem 2"></MenuItem>
                        <MenuItem Header="MenuItem 3"></MenuItem>
                        <MenuItem Header="MenuItem 4"></MenuItem>
                        <MenuItem Header="MenuItem 5"></MenuItem>
                        <MenuItem Header="MenuItem 6"></MenuItem>
                        <MenuItem Header="MenuItem 7"></MenuItem>
                        <MenuItem Header="MenuItem 8"></MenuItem>
                        <MenuItem Header="MenuItem 9"></MenuItem>
                    </ContextMenu>
                </Button.ContextMenu>
            </Button>
        </WrapPanel>
    </Grid>
</Window>

Только XAML, абсолютно никакого кода в моем тестовом приложении.

Мои пользователи также сообщают, что случайное нажатие на кнопки ничего не делает в диалоговых окнах. Когда это происходит, они могут нажать только верхнюю правую кнопку закрытия; выпадающие списки и меню больше не работают в главном окне, как описано выше: их нужно закрыть и перезапустить приложение. Не воспроизвел это с образцом, я думаю, это та же ошибка.

Кроме того, мое приложение иногда падает с Windows 10 Creators Update или .NET 4.7, возможно, также с KB4034658. К сожалению, я не могу сказать, когда происходят эти сбои, но подозреваю, что они каким-то образом связаны с описанной выше проблемой.

Пример информации о сбое из журнала событий Windows:

      <Category>0</Category>
      <ComputerName>DESKTOP-XXXXXX</ComputerName>
      <EventCode>1026</EventCode>
      <EventIdentifier>1026</EventIdentifier>
      <EventType>1</EventType>
      <InsertionStrings>Application: MyApp.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IndexOutOfRangeException
   at System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Insert(System.__Canon, System.__Canon, Boolean)
   at System.Windows.Input.StylusWisp.WispLogic.CoalesceAndQueueStylusEvent(System.Windows.Input.RawStylusInputReport)
   at System.Windows.Input.PenContext.FirePackets(Int32, Int32[], Int32)
   at System.Windows.Input.PenThreadWorker.FlushCache(Boolean)
   at System.Windows.Input.PenThreadWorker.FireEvent(System.Windows.Input.PenContext, Int32, Int32, Int32, Int32, IntPtr)
   at System.Windows.Input.PenThreadWorker.ThreadProc()
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()

</InsertionStrings>
      <Logfile>Application</Logfile>
      <Message>Application: MyApp.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IndexOutOfRangeException
   at System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Insert(System.__Canon, System.__Canon, Boolean)
   at System.Windows.Input.StylusWisp.WispLogic.CoalesceAndQueueStylusEvent(System.Windows.Input.RawStylusInputReport)
   at System.Windows.Input.PenContext.FirePackets(Int32, Int32[], Int32)
   at System.Windows.Input.PenThreadWorker.FlushCache(Boolean)
   at System.Windows.Input.PenThreadWorker.FireEvent(System.Windows.Input.PenContext, Int32, Int32, Int32, Int32, IntPtr)
   at System.Windows.Input.PenThreadWorker.ThreadProc()
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()
</Message>
      <RecordNumber>250</RecordNumber>
      <SourceName>.NET Runtime</SourceName>
      <TimeGenerated>8/1/2017 2:10:56 PM</TimeGenerated>
      <TimeWritten>8/1/2017 2:10:56 PM</TimeWritten>
      <Type>Error</Type>

2-й образец:

      <Category>0</Category>
      <ComputerName>DESKTOP-XXXXXX</ComputerName>
      <EventCode>1026</EventCode>
      <EventIdentifier>1026</EventIdentifier>
      <EventType>1</EventType>
      <InsertionStrings>Application: MyApp.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentNullException
   at System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].FindEntry(System.__Canon)
   at System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].TryGetValue(System.__Canon, System.__Canon ByRef)
   at System.Windows.Input.StylusLogic.ProcessInputReport(System.Windows.Input.RawStylusInputReport)
   at System.Windows.Input.PenContext.FirePenOutOfRange(Int32, Int32)
   at System.Windows.Input.PenThreadWorker.ThreadProc()
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()

</InsertionStrings>
      <Logfile>Application</Logfile>
      <Message>Application: MyApp.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentNullException
   at System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].FindEntry(System.__Canon)
   at System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].TryGetValue(System.__Canon, System.__Canon ByRef)
   at System.Windows.Input.StylusLogic.ProcessInputReport(System.Windows.Input.RawStylusInputReport)
   at System.Windows.Input.PenContext.FirePenOutOfRange(Int32, Int32)
   at System.Windows.Input.PenThreadWorker.ThreadProc()
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()
</Message>
      <RecordNumber>534</RecordNumber>
      <SourceName>.NET Runtime</SourceName>
      <TimeGenerated>7/31/2017 1:13:39 PM</TimeGenerated>
      <TimeWritten>7/31/2017 1:13:39 PM</TimeWritten>
      <Type>Error</Type>

Я сообщил об ошибках на страницах https://connect.microsoft.com/VisualStudio и https://github.com/Microsoft/dotnet/issues

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

Интересно, возникает ли ошибка только на MS Surface. Я не нашел другого сообщения об этой ошибке, поэтому я так думаю. Нет хороших шансов исправить это в ближайшее время... WPF и Surface - слишком экзотично.

В этом посте я надеюсь, что несколько человек с Surface воспроизведут ошибку, а также сообщат об ошибке в Microsoft, чтобы увеличить вероятность того, что она будет исправлена ​​MS как можно скорее. Кроме того, я хотел бы знать, возникает ли эта ошибка только на планшетах MS Surface или также на других планшетах, возможно, только на планшетах с высоким разрешением?


person Andy    schedule 16.08.2017    source источник
comment
В качестве временного обходного пути для ваших пользователей вы можете найти способ заставить приложение работать под 4.6.2, возможно, Принудительно запускать приложение в конкретной версии среды выполнения .NET? помогает.   -  person Andrew Morton    schedule 16.08.2017
comment
4.7 устанавливается вместо 4.x, а не параллельно. Невозможно принудительно установить 4.6.2, если установлена ​​версия 4.7. Кроме того, это не поможет с Security KB4034658. Но спасибо за ваше предложение! Я попробовал свое тестовое приложение, ориентированное на .NET 3.5. В 1-м тесте описанная ошибка не возникает .... но мое приложение использует сторонние компоненты, доступные только для 4.x, потребуется изменить много кода, и я не знаю, все ли работает нормально (возможно, другие ошибки в 3.5), и нельзя быть уверенным, что другое обновление безопасности вносит ошибку также в 3.5.   -  person Andy    schedule 18.08.2017
comment
Полагаю, это было бы слишком просто. Ошибка по-прежнему возникает, если у вас нет кода для меню? Если нет, есть ли конкретная строка кода, которая вызывает ошибку? Я нашел кое-что относительно проблема с System.__Canon, когда сборка выпуска показала проблему, а сборка отладки - нет, поэтому, возможно, вы могли бы протестировать сборку отладки.   -  person Andrew Morton    schedule 18.08.2017
comment
... также странное исключение System.__Canon имеет объяснение.   -  person Andrew Morton    schedule 18.08.2017
comment
Ошибка возникает в сборке Release и Debug. Делать щелчок правой кнопкой мыши ручкой не очень весело, но я удалил код кнопки меню... ошибка по-прежнему возникает абсолютно без кода. Да, это звучит слишком просто, и поэтому я боюсь, что никто даже не попытается проверить мою сообщенную ошибку, скорее всего, подумает, что я шучу (в лучшем случае).   -  person Andy    schedule 19.08.2017
comment
У нас возникают проблемы с зависанием приложения в нашем сенсорном приложении WPF. Я нашел очень похожую на вашу ошибку (поиск CoalesceAndQueueStylusEvent открывает только эту страницу). Наши пользователи работают с планшетами Windows 8.1 и Windows 10 с установленным .NET Framework 4.7. Так что в настоящее время я также изучаю это направление для дальнейшего тестирования. Я буду держать вас в курсе.   -  person Bruno V    schedule 31.08.2017
comment
@Bruno: Ваши пользователи работают с планшетами MS Surface или другими? Я не думаю, что MS следует за ошибками, о которых сообщается в stackoverflow. Если у вас также есть такие же или похожие проблемы, присоединяйтесь к существующим отчетам об ошибках на странице connect.microsoft.com/VisualStudio. /Отзыв например. #3139096, #3139101, #3139882 или создайте новый.   -  person Andy    schedule 31.08.2017
comment
Проблема возникает как на планшетах Dell, так и на планшетах Surface с установленной .NET Framework 4.7. Я добавил свой отзыв по последнему вопросу, потому что он больше всего похож на мой: 3139882   -  person Bruno V    schedule 01.09.2017
comment
@Энди: я хотел убедиться, что это не имеет ничего общего с нашим приложением, поэтому я протестировал ваше приложение на планшете Dell и смог смоделировать проблему. Примерно через минуту нажатия на элементы управления раскрывающийся список ComboBox и меню все еще открыты, но никакой другой элемент выбрать нельзя. Я думаю, вы можете пересечь поверхность вашего списка :-).   -  person Bruno V    schedule 01.09.2017
comment
Спасибо за тестирование моего образца на планшете Dell! Приятно знать, что ошибка возникает и на других планшетах.   -  person Andy    schedule 01.09.2017
comment
Пробовали ли вы обновиться до .NET Framework 4.7.1? Кажется, это решает нашу проблему.   -  person Bruno V    schedule 13.12.2017
comment
Да, 4.7.1 решает эту проблему для апрельского и юбилейного обновлений Creators. Ноябрьское накопительное обновление окончательно решает эту проблему и для обновления Creators Fall. Я на самом деле пытаюсь предотвратить установку обновления Fall   -  person Andy    schedule 13.12.2017


Ответы (2)


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

Однако отключение RealTimeStylus также отключает прокрутку ScrollViewer с помощью трогать. Это также может повлиять на использование стилуса, я не смог проверить это.

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

    public static void DisableWPFTabletSupport()
    {
        // Get a collection of the tablet devices for this window.  
        TabletDeviceCollection devices = System.Windows.Input.Tablet.TabletDevices;

        if (devices.Count > 0)
        {
            // Get the Type of InputManager.
            Type inputManagerType = typeof(System.Windows.Input.InputManager);

            // Call the StylusLogic method on the InputManager.Current instance.
            object stylusLogic = inputManagerType.InvokeMember("StylusLogic",
                        BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
                        null, InputManager.Current, null);

            if (stylusLogic != null)
            {
                //  Get the type of the device class.
                Type devicesType = devices.GetType();

                // Loop until there are no more devices to remove.
                int count = devices.Count + 1;

                while (devices.Count > 0)
                {
                    // Remove the first tablet device in the devices collection.
                    devicesType.InvokeMember("HandleTabletRemoved", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, devices, new object[] { (uint)0 });

                    count--;

                    if (devices.Count != count)
                    {
                        throw new Win32Exception("Unable to remove real-time stylus support.");
                    }
                }
            }
        }
    }
person Bruno V    schedule 04.09.2017
comment
Этот хак, кажется, решает проблемы со списком и меню. Он нарушает сенсорную прокрутку для элементов управления WPF (ScrollViewer, ComboBox, DataGrid, ...?), но это может быть незначительной проблемой для моих пользователей. Я попробую этот обходной путь. Спасибо!!! - person Andy; 06.09.2017
comment
Я рад, что смог помочь. К сожалению, для нас этого исправления недостаточно, нам нужно поддерживать сенсорную прокрутку ScrollViewer. Я создал отдельный вопрос, чтобы исправить это: stackoverflow.com/q/46049673/3357566 - person Bruno V; 06.09.2017
comment
Я был оптимистичен, запись на InkCanvas работала, сенсорная прокрутка в браузере CEF работала ... но кнопка ластика не работает на InkCanvas. - person Andy; 06.09.2017

этот вопрос немного назад, но у меня есть объяснение «больше не отвечает на графический интерфейс».

Если элемент не виден на 100% в списке (депонирован) и вы выполняете щелчок, то список сначала прокручивает элемент полностью видимым. Все работает с мышкой. Но событие TouchUp срабатывает непосредственно перед прокруткой. И именно здесь происходит ошибка. Я обхожу это, ожидая «Click-Event», независимо от того, касание это или мышь, 10 мс, и только затем выполняю свое действие. Таким образом, ошибка у меня исправлена.

person Florian    schedule 10.09.2018