通过这段代码,我可以得到一个内容呈现器。我想要找到它内部的第一个文本框,并将焦点设置在该文本框上。
Dim obj = TerritoryListViewer.ItemContainerGenerator.ContainerFromItem(myModel)
通过这段代码,我可以得到一个内容呈现器。我想要找到它内部的第一个文本框,并将焦点设置在该文本框上。
Dim obj = TerritoryListViewer.ItemContainerGenerator.ContainerFromItem(myModel)
VisualTreeHelper
静态类来遍历控件树。以下是在 c# 中实现的方法(抱歉我有 VB 识别障碍): T FindFirstChild<T>(FrameworkElement element) where T: FrameworkElement
{
int childrenCount = VisualTreeHelper.GetChildrenCount(element);
var children = new FrameworkElement[childrenCount];
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(element, i) as FrameworkElement;
children[i] = child;
if (child is T)
return (T)child;
}
for (int i = 0; i < childrenCount; i++)
if (children[i] != null)
{
var subChild = FindFirstChild<T>(children[i]);
if (subChild != null)
return subChild;
}
return null;
}
ContentPresenter
只有一个子元素。你可以通过以下方式获取这个子元素:
VisualTreeHelper.GetChild(yourContentPresenterObj, 0);
如果你需要深入到第一个找到的TextBox
,那么是的,你需要使用@alpha-mouse建议的更全面的方法。
Dim myContentPresenter = CType(obj, ContentPresenter)
Dim myDataTemplate = myContentPresenter.ContentTemplate
Dim target = CType(myDataTemplate.FindName("txtQuantity", myContentPresenter), TextBox)
ItemsControl
内部。MeasureOverride()
中获取这些控件:var foobarControls =
InternalChildren
.OfType<ContentPresenter>()
.Where(c => VisualTreeHelper.GetChildrenCount(c) > 0)
.Select(c => VisualTreeHelper.GetChild(c, 0))
.OfType<FoobarControlBase>();
ContentPresenter
没有子元素的情况。我发现在某些情况下,根据调用时间,可能尚未建立可视树,因此ContentPresenters
将没有子元素。(实际上,这种情况本身可能是一个错误,但无论如何,这段代码被证明是可靠的。)