Установка свойства стиля системного элемента фреймворка Windows вызвала исключение
Обновлено: 21.11.2024
Обратите внимание на следующие факты о Windows Presentation Foundation:
Основные факты о XAML
Обратите внимание на следующие факты о расширяемом языке XAML для рынка приложений:
- XAML использует теги XML, поэтому ваши теги должны соответствовать обычным правилам для правильно сформированного XML.
- Элементы представлены в файле .xaml с использованием тегов XML. Каждый тег имеет идентичный связанный класс WPF. Например, тег соответствует объекту WPF Button.
- Элементы XAML соответствуют классам WPF, а атрибуты XAML соответствуют свойствам классов WPF.
- Элемент XAML может иметь один или несколько дочерних элементов.
- Все, что вы можете сделать с помощью XAML, вы также можете сделать, манипулируя объектной моделью с помощью процедурного кода. XAML обычно проще в использовании, чем процедурный код.
- Приложение XAML состоит из набора элементов, содержащих следующие функциональные категории:
- Корневые элементы. Они функционируют как корневые элементы страницы. Наиболее часто используемые корневые элементы — это
элемент и
В результате использования XAML ваш код пользовательского интерфейса формирует древовидную иерархию, называемую деревом элементов.
Основные примеры
Следующие примеры предназначены для быстрого ознакомления с WPF. Эти примеры и их содержание будут подробно рассмотрены в последующих главах. А пока рассматривайте этот пример как предварительный просмотр синтаксиса XAML и макета кода.
Пример 1
Рассмотрите чрезвычайно простое WPF-приложение Hello XAML:
Вывод показан ниже:
Пример 2
Рассмотрите следующий WPF, который иллюстрирует очень простой макет страницы:
Обратите внимание на следующее в предыдущем XAML:
- Элемент StackPanel разместил свои дочерние элементы вертикально в том порядке, в котором они отображаются в файле XAML. Чтобы кнопки отображались горизонтально, можно добавить к элементу атрибут Orientation.
- Свойство элемента HorizontalAlignment выравнивает кнопки с родительской панелью.
- Свойства Wid и Margin элемента иллюстрируют два из множества атрибутов, которые можно использовать для точной настройки внешнего вида элемента.
Пример 3
Рассмотрите следующий WPF, иллюстрирующий сложный макет страницы:
Текст под кнопками
Обратите внимание на следующее в предыдущем XAML:
- Сложные макеты создаются с использованием панелей (обычно ) в качестве контейнеров других панелей, обычно и .
- Дочерние элементы должны указывать свое расположение на стыковочной панели, устанавливая соответствующие атрибуты DockPanel.Dock.
- Очень полезно назначать разные цвета фона для каждого элемента макета, особенно для дочерних элементов стыковочных панелей. Различные цвета показывают, какой элемент занимает каждую область.
Пример 4
В следующем приложении WPF показано, как обрабатывать события кнопок:
открытый частичный класс Window1 : System.Windows.Window
public Window1()
InitializeComponent();
>public void Button1_Hanbdler(object oSender, RoutedEventArgs args)
MessageBox.Show("Кнопка была нажата");
>
>Пример 5
В следующем примере представлен
элемент, который обычно используется в качестве корневого элемента.
элемент — это прокси для окна, содержащего страницу. Вы можете использовать его декларативно для установки свойств окна, таких как Высота или Ширина. Приложение WPF обычно состоит из нескольких динамических страниц XAML. Пользователь продвигается по приложению, переходя от одного к другому. При желании вы можете открыть новое окно для отображения новой страницы. Однако самый простой способ перейти на новую страницу — это использовать элемент (использует объект гиперссылки приложения для обеспечения перехода на указанную целевую страницу).
Ниже показано, как создать многостраничное приложение. Во-первых, окно запуска идентифицируется объектом Application через атрибут StartupUri:
Ниже показан код главной страницы, которая будет размещена в главном окне приложения:
Перейти на страницу 2 - Способ 1
Перейти на страницу 2 - Способ 2
Перейти на страницу 2 - Способ 3
р>открытый частичный класс Page1 : System.Windows.Controls.Страница
public Page1()
InitializeComponent();
>private void ClickHandler_Method1(object sender, RoutedEventArgs e)
// Создать новую страницу
Page2 page2 = new Page2();
page2.InitializeComponent();// Переход на новую страницу
NavigationWindow navWindow = (NavigationWindow)App.Current.MainWindow;
navWindow.Content = page2;
>private void ClickHandler_Method2(object sender, RoutedEventArgs e)
// Получить окно навигации
NavigationWindow navWindow = (NavigationWindow)App.Current.MainWindow;// Переход к новому окну
navWindow.Navigate(new Uri("Page2.xaml", UriKind.RelativeOrAbsolute));
>private void ClickHandler_Method3(object sender, RoutedEventArgs e)
// Получить окно навигации
NavigationWindow navWindow = (NavigationWindow)App.Current.MainWindow;// Переход к новому окну
navWindow.Source = new Uri("Page2.xaml", UriKind.RelativeOrAbsolute);
>
>Обработчик события Click реализован в файле кода программной части страницы. По соглашению файл кода программной части имеет то же имя, что и файл .xaml, к которому добавляется расширение для конкретного языка (например, Page1.xaml.cs ). Итак, чтобы обработать событие Click для элемента, мы добавили следующий код в Page1.xaml.cs (обратите внимание, что класс является разделяемым):
private void ClickHandler_Method1(object sender, RoutedEventArgs e)
// Создаем новую страницу
Page2 page2 = new Page2();
page2.InitializeComponent();// Переход на новую страницу
NavigationWindow navWindow = (NavigationWindow)App.Current.MainWindow;
navWindow.Content = page2;
>Обратите внимание, что при компиляции приложения код XAML в Page1.xaml преобразуется в эквивалентную реализацию частичного класса с именем Page1.g.cs . Эта реализация имеет пространство имен и имя класса, указанные атрибутом x:Class в корневом элементе. Этот разделяемый класс объединяется с классом в файле кода программной части для создания исполняемой страницы.
Базовые элементы
Большой процент классов в WPF наследуется от четырех классов, которые в этой документации обычно называются классами базовых элементов. Это UIElement , FrameworkElement , ContentElement и FrameworkContentElement .
UIElement обеспечивает отправную точку для макета, ввода с клавиатуры/мыши, поведения фокусировки и вызова маршрутизируемых событий. UIElement можно считать примерно эквивалентным дескриптору окна в программировании Win32. Класс ContentElement реализует многие из тех же членов, что и UIElement; разница между этими двумя классами связана с их предполагаемым местом в общей модели контента. Производный класс UIElement определяет жесткую модель содержимого, а это означает, что существуют ограничения на то, какие элементы могут быть дочерними элементами в разметке. Производный класс ContentElement обычно не так ограничивает содержимое, как UIElement , для поддержки таких сценариев, как документы потокового формата.
UIElement наследуется от FrameworkElement , а ContentElement наследуется от FrameworkContentElement . Причина для этого следующего уровня классов состоит в том, чтобы поддержать понятие ядра WPF, которое отделено от WPF Framework: ядро WPF — это подмножество функций программирования WPF, доступных в WindowsBase.DLL. WPF Framework — это полный набор всех функций программирования WPF, доступный в PresentationFramework.DLL.
Следующее дерево показывает, как соотносятся вышеперечисленные классы:
System.Windows.DependencyObject
System.Windows.ContentElement
System.Windows.FrameworkContentElement
Производные классыSystem.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
Производные классыWPF имеет систему свойств, основной функцией которой является вычисление значений свойств и предоставление системных уведомлений об изменениях значений. Центральным понятием в этой системе свойств является свойство зависимостей. «Свойство зависимости» — это экземпляр класса DependencyProperty, зарегистрированный в WPF. «Свойство зависимости» позволяет любому свойству вашего пользовательского типа поддерживать выражения значений, аннулирование свойства, значения по умолчанию для каждого типа, наследование, привязку данных, анимацию или стиль. Еще одним центральным классом в «системе свойств» WPF в дополнение к классу DependencyProperty является класс DependencyObject. Класс DependencyObject является базовым классом классов WPF и позволяет объектам использовать свойства зависимостей.
Самый практичный способ создать пользовательский класс, расширяющий WPF, — создать подкласс одного из классов WPF, чтобы вы могли получить часть функций через иерархию.В этом разделе перечислены функции трех наиболее важных классов, которые помогут вам решить, от какого класса следует наследовать:
Поддержка GetValue и SetValue.
Возможность использовать свойства зависимостей и прикрепленные свойства.
Функциональность, предоставляемая DependencyObject .
Поддержка анимации. Дополнительные сведения см. в разделе Обзор анимации в MSDN.
Базовая поддержка событий ввода и поддержка команд.
Виртуальные методы, которые можно переопределить, чтобы предоставить информацию менеджеру компоновки.
Функциональность обеспечивается UIElement .
Поддержка стилей и раскадровок. Дополнительные сведения см. в разделе Обзор стилей и анимации в MSDN
Поддержка привязки данных.
Поддержка наследования свойств и другие флаги в метаданных, которые помогают сообщать условия о свойствах службам платформы, таким как привязка данных, стили или реализация макета платформы.
Функциональность, предоставляемая DependencyObject .
Поддержка анимации. Дополнительные сведения см. в разделе Обзор анимации в MSDN.
Базовая поддержка событий ввода и поддержка команд.
Функциональность обеспечивается ContentElement .
Поддержка стилей и раскадровок. Дополнительные сведения см. в разделе Обзор стилей и анимации.
Поддержка привязки данных.
Поддержка наследования свойств и другие флаги в метаданных, которые помогают сообщать условия о свойствах службам платформы, таким как привязка данных, стили или реализация макета платформы.
У вас нет доступа к модификациям менеджера компоновки (например, ArrangeOverride).
Дерево элементов
WPF содержит "логическую" древовидную структуру, которая используется для организации элементов и компонентов. Это дерево не предназначено для непосредственного управления, но понимание концепции логического дерева помогает понять, как наследование свойств и маршрутизация событий работают в Windows Presentation Foundation
Помимо концепции логического дерева, в Windows Presentation Foundation также существует концепция визуального дерева. Дерево визуалов описывает структуру визуалов, представленных базовым классом Visual. Визуальное дерево представляет наибольший интерес для разработчиков, которым нужен низкоуровневый контроль над рисованием из соображений производительности и оптимизации, и, как правило, это не та концепция, которая предоставляется разработчикам, работающим в основном с существующими элементами управления и с расширяемым языком разметки приложений (XAML).< /p>
Рассмотрите DockPanel, который содержит элементы управления Button и TextBlock. Если задать свойство FontWeight для DockPanel , элемент управления TextBlock наследует значение свойства FontWeight от родительского элемента DockPanel. Свойство наследуется через своего логического родителя или визуального родителя, но логический родитель используется, если присутствуют оба родителя. Кроме того, ссылки на ресурсы разрешаются путем поиска вверх по логическому дереву коллекций ресурсов
Посредством маршрутизации событий родительские элементы участвуют в событиях, направляемых их дочерним элементам или другим потомкам. В отличие от свойств и ресурсов, событие направляется через своего визуального родителя, если присутствуют и логический родитель, и визуальный родитель
Визуальное дерево также поддерживает вспомогательный класс для обхода дерева VisualTreeHelper . Визуальное дерево не так удобно раскрывается через свойства, относящиеся к элементу управления, поэтому класс VisualTreeHelper является рекомендуемым способом обхода визуального дерева, если это необходимо для вашего сценария программирования. Дополнительные сведения см. в разделе Обзор визуального уровня в MSDN.
Архитектура WPF
В этом разделе рассматривается архитектура WPF путем изучения большинства основных подсистем WFP и описания их взаимодействия.
Основные компоненты WPF представлены ниже:
Красные участки диаграммы (PresentationFramework, PresentationCore и milcore) — это основные части кода WPF. Из них только milcore написан в неуправляемом коде из-за 1) тесной интеграции с DirectX и 2) соображений производительности.
System.Threading.DispatcherObject
Большинство объектов в WPF являются производными от DispatchObject, который предоставляет функциональные возможности для работы с параллелизмом и многопоточностью. WPF основан на системе обмена сообщениями, реализованной диспетчером (очень похожей на пересылку сообщений Win32).
При обсуждении параллелизма в WPF необходимо понимать две основные концепции: диспетчер и сходство с потоком. Сходство с потоком возникает, когда компонент использует идентификатор исполняемого потока для хранить некоторый тип состояния (наиболее распространенным является локальное хранилище потока — TLS). Привязка потоков требует, чтобы каждый логический поток выполнения принадлежал одному и только одному физическому потоку в ОС. Модель потоков WPF синхронизирована с существующей моделью потоков User32 для однопоточного выполнения с привязкой к потокам.
Учитывая, что объекты WPF имеют потоки STA, вам нужен способ связи между потоками и проверки того, что вы находитесь в правильном потоке. Это роль диспетчера: диспетчер — это базовая система диспетчеризации сообщений с несколькими приоритетными очередями. Наследуя от DispatchObject, вы получаете объект CLR, который ведет себя как STA и получает указатель на диспетчер во время создания.
Система.Windows.DependencyObject
WPF отдает предпочтение свойствам, а не методам или событиям. Это связано с тем, что свойства являются декларативными и позволяют вам легче указать намерение, а не действие.
WPF предоставляет богатую систему свойств, производную от типа DependencyObject. Система свойств WPF представляет собой систему свойств зависимостей, поскольку она отслеживает зависимости между выражениями свойств и автоматически перепроверяет значения свойств при изменении зависимостей.
Ключевой особенностью системы свойств является понятие прикрепленных свойств. Элементы WPF строятся по принципу композиции и повторного использования компонентов. Например, содержащему элементу, такому как панель макета, требуются дополнительные данные о дочерних элементах для управления его поведением. Вместо того, чтобы связывать все эти свойства с каждым элементом, WPF позволяет любому объекту предоставлять определения свойств для любого другого объекта.
Система.Windows.Media.Visual
Класс Visual — это точка входа в систему компоновки WPF. При программировании WPF вы создаете визуальные элементы и производные типы, которые внутренне взаимодействуют с деревом композиции через протокол обмена сообщениями.
Система.Windows.UIElement
Объект UIElement определяет основные сервисы платформы, включая Layout, Input, Focus и Event (он же LIFE). Макет — это основная концепция WPF. На уровне UIElement макет использует двухэтапную модель с проходами Measure и Arrange. Фаза измерения позволяет компоненту определить, какой размер он хотел бы принять. Этап «Упорядочить» позволяет родительскому элементу расположить и определить размер каждого дочернего элемента.
Ввод (т. е. ввод с клавиатуры или мыши) исходит как сигнал от какого-либо драйвера устройства в режиме ядра и направляется операционной системой в нужный процесс/поток. Затем User32 направляет сообщение в WPF, где оно преобразуется в необработанное входное сообщение WPF и отправляется диспетчеру. Каждое входное событие преобразуется как минимум в два события — событие предварительный просмотр и событие фактическое. О событиях говорят, что они пузырятся, если они проходят от цели вверх к корню, и говорят, что они туннелируют, если они начинаются с корня и проходят вниз к цели. Введите туннель событий предварительного просмотра, что позволит любому элементу в дереве отфильтровать событие или выполнить какое-либо действие. Затем обычное (не предварительное) событие перемещается от цели к корню.
System.Windows.FrameworkElement
FrameworkElement включает в себя, среди прочего, привязку данных и стили. Привязка данных позволяет привязать значение свойства данного элемента к части данных. Самая интересная часть привязки данных в WPF — введение шаблонов данных. Шаблоны данных позволяют вам декларативно указать, как часть данных должна быть визуализирована. Стилизация — это упрощенная форма привязки данных. Используя стиль, вы можете привязать набор свойств из общего определения к одному или нескольким экземплярам элемента.
Класс FrameworkElement — это точка соединения между классами элементов уровня платформы и основным набором служб представления UIElement. Как видно из приведенной ниже иерархии классов, многие классы WPF являются производными от FrameworkElement либо напрямую, либо через промежуточные базовые классы, такие как Panel и Control:
У меня возникает исключение System.Windows.FrameworkElement.Style, когда я хочу запустить FoxTunes.Launcher.exe.
В средстве просмотра событий приложений у меня есть:
Имя установленного приложения FoxTunes.Launcher.exe, версия: 1.0.0.0, место рождения: 0xf2683082
Имя установленного модуля: KERNELBASE.dll, версия: 10.0.17134.1184, место рождения: 0xda43ec6b
Код исключения: 0xe0434352
Знак ошибки: 0x00114622
ID процесса по умолчанию: 0x1648
Время запуска приложения по умолчанию: 0x01d5ba4df709aa33
Chemin d'accès de l 'приложение по умолчанию: C:\Users\xxxx\Downloads\FoxTunes-2.0.7-net461\FoxTunes.Launcher.exe
Последовательность доступа к модулю по умолчанию: C:\WINDOWS\System32\KERNELBASE.dll
Идентификатор взаимодействующего лица: 46151400-723e-47b9-b8d0-c8418f4dac4d
Идентификатор заполненного пакета:
Идентификатор приложения, относящегося к пакету по умолчанию:Я могу воспроизвести эту ошибку на другом компьютере (Windows 10 1909 полностью исправлена).
Есть идеи?
Большое спасибо за ответ.Текст был успешно обновлен, но возникли следующие ошибки:
Не могли бы вы попробовать пакеты "минимальный" и "net40", пожалуйста? Во вторник, 24 декабря 2019 г., в 11:48 Миша Гилберт написал:
Хм, не уверен.Я проверил на Windows 10, хотя, возможно, он устарел. Я посмотрю сегодня. Во вторник, 24 декабря 2019 г., в 11:38 DJCALIEND ***@***.***> написал: > Привет > > Спасибо за ваше программное обеспечение. > > У меня есть исключение System.Windows.FrameworkElementStyle, когда я хочу > запустить FoxTunes.Launcher.exe. > > В средстве просмотра событий приложений у меня есть: > > Имя установленного приложения FoxTunes.Launcher.exe, версия: > 1.0.0.0, местонахождение: 0xf2683082 > Имя модуля по умолчанию: KERNELBASE.dll, версия: 10.0.17134.1184, > horodatage : 0xda43ec6b > Код исключения : 0xe0434352 > Décalage d'erreur : 0x00114622 > ID du processus défaillant : 0x1648 > Heure de début de l'application défaillante : 0x01d5ba4df709aa33 > Chemin d'ac \Users\xxxx\Downloads\FoxTunes-2.0.7-net461\FoxTunes.Launcher.exe > Схема доступа к модулю по умолчанию: C:\WINDOWS\System32\KERNELBASE.dll > ID связи: 46151400-723e-47b9- b8d0-c8418f4dac4d > Имя полного пакета défaillant: > Идентификатор приложения, относящегося к пакету défaillant: > > Я могу воспроизвести эту ошибку на другом компьютере (Windows 10 1909 полностью > исправлена). > > У тебя есть какие-нибудь идеи? > Большое спасибо за ответ. > > — > Вы получили это, потому что подписаны на эту тему. > Ответьте на это письмо напрямую, просмотрите его на GitHub > , > или отмените подписку > > . >
DJCALIEND прокомментировал 24 декабря 2019 г.
Да, это уже сделано, и это то же самое. У меня то же самое с более старой версией FoxTunes.
прокомментировал aidan-g 24 декабря 2019 г.
Я думаю, что это проблема локализации, я никогда не проверял не на английском языке. Продолжаем расследование.
прокомментировал aidan-g 24 декабря 2019 г.
У вас есть файл user.config в Local\FoxTunes.Launcher\FoxTunes.Launcher.exe_Url_ . что-то . \1.0.0.0? Что такое контент?
DJCALIEND прокомментировал 24 декабря 2019 г.
В C:\Users\myname\AppData\Local у меня нет папки FoxTunes.Launcher.
прокомментировал aidan-g 24 декабря 2019 г.
Все в порядке, мне удалось воспроизвести ошибку, установив французскую локаль системы.
прокомментировал aidan-g 24 декабря 2019 г.
Попробуйте заменить файл FoxTunes.UI.Windows.dll на этот
DJCALIEND прокомментировал 24 декабря 2019 г.
Отлично 👍 . Ошибка устранена. Большое спасибо :)
DJCALIEND прокомментировал 24 декабря 2019 г.
Хм, у меня есть еще одна ошибка, исключение FoxDB.Conventions, когда я хочу перейти к настройкам
прокомментировал aidan-g 24 декабря 2019 г.
/// /// Фабричный метод для PluralizationService. Поддерживать только английское множественное число. /// Пожалуйста, установите PluralizationService в System.Data.Entity.Design.EntityModelSchemaGenerator /// для расширения службы на другие локали. /// ///
прокомментировал aidan-g 24 декабря 2019 г. •
Попробуйте заменить файл FoxDb.Core.dll на этот
Вам потребуется удалить файл Database.db
DJCALIEND прокомментировал 24 декабря 2019 г.
Ты молодец 👍 👍 . Ошибка устранена. Спасибо. Я продолжаю тестировать.
прокомментировал aidan-g 24 декабря 2019 г. •
Обновление пакетов выпуска займет некоторое время, так как мне нужно будет опубликовать изменения в этой библиотеке.
Оставьте пока этот вопрос открытым.
DJCALIEND прокомментировал 24 декабря 2019 г.
Хорошо. Если будет обнаружена другая ошибка, я обновлю этот тикет. Хорошего Рождества.
прокомментировал aidan-g 30 декабря 2019 г.
Вы не можете выполнить это действие в данный момент.
Вы вошли в другую вкладку или окно. Перезагрузите, чтобы обновить сеанс. Вы вышли на другой вкладке или в другом окне. Перезагрузите, чтобы обновить сеанс.
Несколько месяцев я добавлял Silverlight RichTextBox в приложение, и оно отлично работало. Несколько недель назад я обновил dll Silverlight в приложении, чтобы попробовать другой компонент, и теперь мой RichTextBox не работает в InitializeComponent(). Что еще более странно, я попытался вернуться к более старым библиотекам DLL, и я все еще получаю сообщение об ошибке. Я уверен, что не думал, что это будет работать несколько месяцев, так что же происходит?
Вот что мне удалось получить из отладчика:
Атрибут /C1.Silverlight.Toolbar;значение компонента/themes/generic.xaml выходит за допустимые пределы. [Строка: 19 Позиция: 36]
System.Windows.Markup.XamlParseException: значение атрибута /C1.Silverlight.Toolbar;component/themes/generic.xaml выходит за допустимые пределы. [Строка: 19 Позиция: 36] ---> System.Collections.Generic.KeyNotFoundException: Данного ключа не было в словаре.
в System.ThrowHelper.ThrowKeyNotFoundException()
в System.Collections.Generic.Dictionary`2.get_Item(TKey key)
в System.Windows.ResourceManagerWrapper.GetResourceForUri(Uri xamlUri, Type componentType )
--- Конец внутренней трассировки стека исключений ---
at MS.Internal.XcpImports.CreateFromXaml(UnmanagedMemoryStream stream, String sourceAssemblyName, Boolean createNamescope, Boolean requireDefaultNamespace, Boolean allowEventHandlers)
at Система.Windows.Controls.Control.GetBuiltInStyle(IntPtr nativeTarget, IntPtr& nativeStyle)
--- Конец внутренней трассировки стека исключений ---
в System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
в SilverlightEditor. MainPage.InitializeComponent()
в SilverlightEditor.MainPage..ctor()>Кто-нибудь видел это раньше или есть идеи?
Ответ написан 7 августа 2017 г., 7:22 по восточному поясному времени
Я предполагаю, что в вашем проекте отсутствует ссылка на C1.Silverlight.Toolbar. Это требуется для C1RichTextBoxToolbar. Странно, что Visual Studio не разрешает зависимость автоматически.
Если это не проблема, опубликуйте пример, который воспроизводит проблему.
Ответ написан 7 августа 2017 г., 7:22 по восточному поясному времени
К сожалению, я ссылаюсь на него. Я даже пытался удалить и снова добавить ссылку, но без радости. Компилируется нормально, но не запускается. Я не думаю, что в моем коде есть что-то особенное, особенно потому, что он дает сбой еще до того, как до него доходит. Вот оно:
пространство имен SilverlightEditor
[ScriptableType]
открытый частичный класс MainPage : UserControl
private Shared mShared = new Shared();
частная строка mSubSystem = "";Эта тема выглядит немного устаревшей и поэтому может быть уже не актуальной. Пожалуйста, посмотрите, нет ли новой темы на эту тему, и убедитесь, что вы используете самую последнюю сборку любого программного обеспечения, если ваш вопрос касается определенного продукта.
Эта тема заблокирована и больше не принимает новые сообщения. Если у вас есть вопросы по этой теме, напишите нам по адресу support@mindscape.co.nz
Если вы загружаете два окна, каждое с DataGrid, и каждое в своем собственном диспетчере/потоке, сетка выдает следующее исключение. Это проблема для меня, потому что мое приложение имеет один поток на окно.
Нам не удалось воспроизвести это с нашей стороны. Причиной этого исключения может быть конкретная функция сетки данных, которую вы используете. Не могли бы вы прислать нам репродукционный проект для этого? Возможно, это просто расширение вашего другого репродукционного проекта.
Найти прикрепленный проект, повторяющий проблему.
1) Установите ownThread = false (в App.xaml.cs) и запустите программу. Это будет работать без каких-либо исключений. В этом параметре создаются два окна с DataGrid каждое. Оба окна работают в одном диспетчере.
2) Теперь установите ownThread = true и запустите программу. Вы увидите исключение. При этой настройке каждое окно создается в своем диспетчере.
Последнее примечание. Если вы закомментируете DataGrid в XAML одного из окон и запустите проект с ownThread = true, он запустится без проблем.
Спасибо за проект репродукции, это упростило отслеживание и решение этой проблемы. Исправление будет доступно в следующей ночной сборке.
Это действительно решено. Спасибо. Нестор
На самом деле, я сказал слишком рано. Я получаю это исключение (как ни странно, только когда я запускаю программу как исполняемый файл, а не в режиме отладки из Visual Studio)
Это будет немного сложно отлаживать, не имея возможности использовать режим отладки Visual Studio. Мне не удалось воспроизвести это с помощью исполняемого файла, созданного вашим предыдущим проектом воспроизведения. Я заметил, что в трассировке стека упоминается Syncfusion, так что это может быть место, чтобы начать изучать его. Если это не проблема, я смогу вам помочь, если вы пришлете еще один репродукционный проект. В конечном итоге это похоже на проблему с объектами зависимостей. Объекты зависимостей можно использовать только в создавшем их диспетчере. Это может быть объектом зависимости с вашей стороны, потому что Mindscape не упоминается. Один из способов решить проблему такого рода — изменить реализацию объекта, чтобы она была обычным объектом, а не объектом зависимости, если это возможно. Если это невозможно сделать, убедитесь, что вы не делитесь объектами зависимостей между диспетчерами.
Это правда, что Mindscape не входит в стек вызовов. Но если я закомментирую DataGrid из XAML, я не получу это исключение. Это странно. Я продолжу копать и дам вам знать, что я найду. Спасибо за вашу помощь. Нестор
Это очень странно. Я вводил вас в заблуждение об этой проблеме, возникающей за пределами VS. Проблема на самом деле не происходит в одной машине. но это происходит на другой машине. Обратите внимание, что стек вызовов такой же, как и первый стек, который я отправил. где Mindscape не отображается в стеке. Тем не менее, вы смогли что-то исправить, чтобы исправить фиктивный проект. Что вы изменили?
В DataGrid есть свойство BuiltInDisplayTemplates и BuiltInEditorStyles. Эти свойства представляют собой коллекции того, что вы могли бы считать простыми объектами кортежа. Эти объекты кортежа имеют ссылку на ключ ресурса и ссылку либо на шаблон, либо на стиль. Эти коллекции по сути представляют собой таблицу поиска шаблонов и стилей ячеек по умолчанию.Эти свойства устанавливаются в каждой из наших 6 тем, поэтому все экземпляры DataGrid, использующие одну и ту же тему, получат один и тот же экземпляр этой коллекции.
Теперь проблема заключается в том, что эти объекты кортежа были реализованы как DependencyObjects, что вызывало проблемы в нескольких диспетчерах. Как я уже упоминал, объекты зависимостей можно правильно использовать только в диспетчере, который их создал. Но все сетки используют один и тот же экземпляр кортежей поиска, что вызывает проблему в вашем сценарии.
Хорошее обнаружение одинаковых тредов. В этом случае, вероятно, это все еще проблема в нашем DataGrid - возможно, какая-то другая проблема с объектом зависимости. Странно, что на одной машине работает, а на другой нет. Убедитесь, что обе машины используют последнее обновление библиотеки DLL WpfElements с исправлением этой проблемы. Я надеюсь, что вы сможете найти дополнительную информацию или создать проект воспроизведения, чтобы помочь в отладке.
Эти проблемы трудно определить. Некоторые вещи, которые я могу отметить:
- Проект репродукции, который я отправил изначально, отлично работает на обеих машинах после последней ночной сборки.
- Но мой основной проект работает только на моей машине разработки, но не на моей тестовой машине (очень странно)
- ВАЖНО: если я НЕ использую Разрешить, основной проект везде работает нормально. так что проблема в вашей теме разрешения
Надеюсь, это поможет. Я буду рад продолжить мозговой штурм с вами, если это поможет.
Читайте также: