C#:WPF,如何解决将动态创建的对象中的事件链接到父元素时的线程问题

C#: WPF, How to solve threading issues when linking events in dynamically created object to the parent element

提问人:Rick Schepers 提问时间:8/15/2023 最后编辑:toyota SupraRick Schepers 更新时间:8/15/2023 访问量:27

问:

我正在创建一个显示目录内容的显示元素,我希望能够更改当前显示的目录,并且能够对文件进行单击事件,文件和目录以 的形式显示。usercontrols

我使用以下代码将这些自定义用户控件从父控件添加到列表框中

private void UpdateFolder(StorageMethods.UDirectory sourceDir)
        {
            Application.Current.Dispatcher.Invoke((Action)(() => this.FolderDisplay.Items.Clear()));
            Application.Current.Dispatcher.Invoke((Action)(() => this.currentDirectory = sourceDir));
            int i = 0;
            foreach (StorageMethods.UDirectory subDir in sourceDir.subDirs)
            {
                Application.Current.Dispatcher.Invoke((Action)(() => this.FolderDisplay.Items.Add(new DirItem(subDir, i))));
                i++;
            }
            foreach (StorageMethods.UFile file in sourceDir.files)
            {
                Application.Current.Dispatcher.Invoke((Action)(() => this.FolderDisplay.Items.Add(new DirItem(file, i))));
                i++;
            }
        }

但是,这不会使父级订阅 s click 事件。DirItem'

我想做的是:

DirItem dI = new DirItem(subDir, i);
                Application.Current.Dispatcher.Invoke((Action)(() => dI.OnItemClick += Di_OnFolderClick));
                Application.Current.Dispatcher.Invoke((Action)(() => this.FolderDisplay.Items.Add(dI)));

这将创建 ,并将其中的事件链接到父控件,但是,当我将 new 传递给调度程序时,会给我一个线程异常,就好像我根本没有使用调度程序一样。 “System.InvalidOperationException:调用线程无法访问此对象,因为其他线程拥有它。”DirItemDirItemfolderDisplay

C# WPF 多线程用户界面 事件

评论

0赞 emoacht 8/15/2023
很难从有限的代码中掌握您在做什么。
0赞 JonasH 8/15/2023
1. 确保您没有多个 UI 线程,这很容易导致问题。2. 为什么要使用“Application.Current.Dispatcher.Invoke”?大多数 UI 应用程序应将 UI 线程用于几乎所有内容,而将 async/await 用于缓慢的 IO 操作。
0赞 Joe 8/15/2023
您在这里确实很难使用 WPF。目录应该由一些非UI类型的类来表示(称之为),你应该把它们存储在一个对象中。然后,您的 UI 应将其属性绑定到该 .应将该属性设置为某种 ,在 XAML 中布局,以显示绑定到对象的某个其他 UI。对于单击,请使用绑定到命令的按钮。DirItemViewModelObservableCollectionListBoxItemsSourceObservableCollectionListBox.ItemTemplateDataTemplateDirItemDirItemViewModel

答: 暂无答案