c#-WPF ItemsCollection.ItemContainerGenerator的可能竞争条件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-WPF ItemsCollection.ItemContainerGenerator的可能竞争条件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2269字,纯文字阅读大概需要4分钟。
内容图文
![c#-WPF ItemsCollection.ItemContainerGenerator的可能竞争条件](/upload/InfoBanner/zyjiaocheng/653/39e46bffa14b40f899a9ad6360f48742.jpg)
在我的应用程序中,我需要在ItemsSource更改后立即获取ItemsCollection的内容.或者,至少在视觉上绘制内容之前.
我测试了以下内容:
void UserControl_Loaded(object sender, EventArgs eventArgs) {
this.itemsControl.ItemsSource = GetItemsSource();
int ctrIndex = 0;
DependencyObject container;
while((container = this.itemsControl.ItemContainerGenerator.
ContainerFromIndex(ctrIndex++)) != null) {
DoSomething(VisualTreeHelper.GetChild(container, 0));
}
}
问题在于,在调用DoSomething时,VisualTreeHelper.GetChildrenCount(container)的值为0.如果在稍后的某个时间调用此代码,例如响应Button.Click事件触发,则VisualTreeHelper .GetChildrenCount是预期值,该代码可能会正常工作.
PS.我还尝试在匿名函数内部进行while循环:
this.itemsControl.ItemContainerGenerator.ItemsChanged += (_sender, _ea) => {
int ctrIndex = 0;
DependencyObject container;
while((container = this.itemsControl.ItemContainerGenerator.
ContainerFromIndex(ctrIndex++)) != null) {
DoSomething(VisualTreeHelper.GetChild(container, 0));
}
};
可悲的是,行为是相同的.
编辑
我不敢相信您必须为生成的内容跳过几圈.
我相信我已经找到了可以安全捕获生成的容器的最早时间.但是,我仍然对那些容器内生成的内容不加关注.请注意以下几点:
this.itemsControl.ItemContainerGenerator.StatusChanged += new EventHandler(StatusChanged);
void StatusChanged(object sender, EventArgs e) {
var cg = this.itemsControl.ItemContainerGenerator;
if(cg.Status == GeneratorStatus.ContainersGenerated && cg.ContainerFromIndex(0) != null) {
DoStuff();
}
}
在调用DoStuff()时,从ContainerFromIndex返回的容器不为null.但是,VisualTreeHelper.GetChildrenCount(container)为0.我仍然非常想知道是否有人解决了这个问题.
解决方法:
几分钟前,我遇到了同样的问题.几乎没有什么不同,我需要项目容器的确切位置和大小信息.我尝试过尝试侦听ItemContainerGenerator的StatusChanged事件,最后发现,尽管状态变为ContainersGenerated并且确实生成了容器,但它们尚未布置.
所以我做了一些非常粗鲁的事.首先,我设置了一个标志,例如_updatePending,而ItemContainerGenerator的状态变为ContainersGenerated,然后我处理了ItemsControl的LayoutUpdated事件,该事件会频繁触发,以检查_updatePending标志以及项目容器的布局:
var firstContainer = this.ItemsContainer.ItemContainerGenerator.ContainerFromIndex(0) as FrameworkElement;
if (_updatePending
&& firstContainer != null
&& firstContainer.IsLoaded)
{
// do stuff
_updatePending = false;
}
这是残酷的,但以某种方式有效.
内容总结
以上是互联网集市为您收集整理的c#-WPF ItemsCollection.ItemContainerGenerator的可能竞争条件全部内容,希望文章能够帮你解决c#-WPF ItemsCollection.ItemContainerGenerator的可能竞争条件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。