use*_*583 4 c# wpf user-controls itemscontrol visual-tree
我有ItemsControl和Grid作为ItemsPanelTemplate
<ItemsControl ItemsSource="{Binding CellCollection}" Name="CellGrid">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid Name="grid" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
我在代码隐藏中使用此ItemControl创建了一些UserControl,然后我需要创建RowDefinitions和ColumnDefinitons.我使用这种方法得到"网格":
private TChildItem FindVisualChild<TChildItem>(DependencyObject obj) where TChildItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
var child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is TChildItem)
return (TChildItem)child;
var childOfChild = FindVisualChild<TChildItem>(child);
if (childOfChild != null)
return childOfChild;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在显示UserControl之前调用此方法它返回null,所以我无法找到访问"网格",当UserControl出现时它显示不像我预期的那样.
我试图谷歌,但我发现的是假设VisualTree没有为ItemControl构建,直到它在表单上显示.
有什么建议?谢谢,抱歉英文不好;)
Ste*_*eve 10
您可以调用ApplyTemplate,它告诉元素应用模板并构建可视化树.
虽然,这不会一直应用模板.在这种情况下,您首先必须调用ApplyTemplate()ItemsControl,然后var item_presenter = FindVisualChild<ItemsPresenter>(items_control),您必须调用item_presenter.ApplyTemplate(),现在您将强制Grid进入VisualTree.
| 归档时间: |
|
| 查看次数: |
6719 次 |
| 最近记录: |