创建UI的线程才能访问UI,那么怎样才算访问UI呢

时间:2021-09-30 18:17:44

只有创建UI元素的线程(主线程又叫UI线程)才能访问UI元素。在UI线程中工作,不会有这个问题。

在后台线程中,如果直接访问UI元素,会抛出 “调用线程无法访问此对象,因为另一个线程拥有该对象” 异常。

在后台线程中,集合控件绑定在数据集上,增加或减少数据集会引起UI重绘,会抛出 “该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改” 异常。

在后台线程中工作,将访问UI的工作封送到UI线程来避免这个问题。

那么,怎么样的动作算是访问UI元素呢?

最简单的判断方法就是看所调用的方法/属性是否会调用 DispatcherObject 的 VerifyAccess()方法

总结得出

普通控件在数据绑定中,通过修改数据来修改元素呈现的内容   不算访问  
集合控件在数据绑定中,通过修改数据集内容来修改集合控件呈现的内容(集合控件包括DataGrid、ListBox、ListView等)   不算访问
集合控件在数据绑定中,通过增加或减少数据集行数来修改集合控件呈现的内容   算访问,会引起UI重绘  
通过元素名称,获取或修改元素的非依赖项属性值 不算访问
通过元素名称,获取或修改元素的依赖项属性值 算访问