使用代码,我可以获得一个内容呈现器。我想要定位其中的第一个文本框,并相应地设置焦点。
Dim obj = TerritoryListViewer.ItemContainerGenerator.ContainerFromItem(myModel)
发布于 2010-11-12 19:11:33
您可以使用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;
}
发布于 2010-11-12 18:52:44
Dim myContentPresenter = CType(obj, ContentPresenter)
Dim myDataTemplate = myContentPresenter.ContentTemplate
Dim target = CType(myDataTemplate.FindName("txtQuantity", myContentPresenter), TextBox)
发布于 2020-04-01 02:43:24
在我的例子中,我需要迭代放置在自定义画布上的某个基类型的所有控件,该画布正在ItemsControl
中使用。
此Linq表达式用于从MeasureOverride()
中获取这些控件
var foobarControls =
InternalChildren
.OfType<ContentPresenter>()
.Where(c => VisualTreeHelper.GetChildrenCount(c) > 0)
.Select(c => VisualTreeHelper.GetChild(c, 0))
.OfType<FoobarControlBase>();
这可以防止ContentPresenter
没有孩子的情况发生。我发现在某些情况下,根据调用时间的不同,可视化树可能无法建立,因此ContentPresenters
将没有子级。(实际上,这种情况本身可能是一个错误,但尽管如此,事实证明这段代码是可靠的。)
https://stackoverflow.com/questions/4163754
复制相似问题