使用代码我可以获得内容演示者。我想在其中找到第一个文本框并相应地设置焦点。
Dim obj = TerritoryListViewer.ItemContainerGenerator.ContainerFromItem(myModel)
答案 0 :(得分:28)
您可以使用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;
}
答案 1 :(得分:9)
ContentPresenter
是唯一的孩子。您只需
VisualTreeHelper.GetChild(yourContentPresenterObj, 0);
如果你需要更深入 - 直到第一次找到TextBox
,那么,是的,你使用@ alpha-mouse建议的更全面的方法。
答案 2 :(得分:3)
Dim myContentPresenter = CType(obj, ContentPresenter)
Dim myDataTemplate = myContentPresenter.ContentTemplate
Dim target = CType(myDataTemplate.FindName("txtQuantity", myContentPresenter), TextBox)
答案 3 :(得分:0)
对于我来说,我需要迭代放置在ItemsControl
内部使用的自定义画布上的某种基本类型的所有控件。
此Linq表达式用于从MeasureOverride()
中获取这些控件:
var foobarControls =
InternalChildren
.OfType<ContentPresenter>()
.Where(c => VisualTreeHelper.GetChildrenCount(c) > 0)
.Select(c => VisualTreeHelper.GetChild(c, 0))
.OfType<FoobarControlBase>();
这可以防止ContentPresenter
没有孩子的情况。我发现在某些情况下可能取决于何时未建立视觉树,因此ContentPresenters
将没有子树。 (实际上,这种情况本身可能是一个错误,但是尽管如此,该代码还是可靠的。)