每个ItemsControl
的内容都存储在Panel中吗?我们可以像这样指定要在XAML中使用的面板:
<ListView Name="LView">
<ListView.ItemsPanel>
<ItemsPanelTemplate >
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
我的问题是如何获取特定Panel
的{{1}}属性(类型ItemsPanel
)中使用的ItemsPanelTemplate
实例?例如,来自代码示例的名为ItemsControl
的{{1}}?
我无法使用ListView
属性或LView
,这对任何使用默认Name
的{{1}}都必须有效。
如果不清楚请评论,我认为有非常简单的解决方案。如果它似乎很复杂,那只是因为我无法正确解释它。
答案 0 :(得分:17)
这有点棘手,因为您不知道Panel的名称,所以您不能使用FindName等。这适用于存在ItemsPresenter
的大多数情况
private Panel GetItemsPanel(DependencyObject itemsControl)
{
ItemsPresenter itemsPresenter = GetVisualChild<ItemsPresenter>(itemsControl);
Panel itemsPanel = VisualTreeHelper.GetChild(itemsPresenter, 0) as Panel;
return itemsPanel;
}
GetVisualChild的实现
private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
但是,并不总是使用ItemsPanel。请参阅Ian Griffiths的this answer作为一个很好的解释。
答案 1 :(得分:3)
我无法为您提供工作代码,但请看一下 VisualTreeHelper class。 使用VisualTreeHelper类,您可以将可视化树遍历到模板和面板。
答案 2 :(得分:2)
protected Panel ItemsHost {
get {
return (Panel) typeof (MultiSelector).InvokeMember("ItemsHost",
BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance,
null, this, null);
}
}
这就像我ItemsControl
中的魅力一样!也就是说,IsItemsHost="True"
内部确实有Panel
,但如果没有它,它甚至可以正常工作。
Trick来自这个帖子:Can I access ItemsHost of ItemsControl using reflection?
答案 3 :(得分:0)
export AWS_ACCESS_KEY_ID=aws_access_key_id
export AWS_SECRET_ACCESS_KEY=default_secret_key