我在XAML UI中添加了动态添加的控件。 如何找到具有名称的特定控件。
答案 0 :(得分:7)
有办法做到这一点。您可以使用VisualTreeHelper
遍历屏幕上的所有对象。我使用的一种方便的方法(从网上获得它)是FindControl
方法:
public static T FindControl<T>(UIElement parent, Type targetType, string ControlName) where T : FrameworkElement
{
if (parent == null) return null;
if (parent.GetType() == targetType && ((T)parent).Name == ControlName)
{
return (T)parent;
}
T result = null;
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
UIElement child = (UIElement)VisualTreeHelper.GetChild(parent, i);
if (FindControl<T>(child, targetType, ControlName) != null)
{
result = FindControl<T>(child, targetType, ControlName);
break;
}
}
return result;
}
你可以像这样使用它:
var combo = ControlHelper.FindControl<ComboBox>(this, typeof(ComboBox), "ComboBox123");
答案 1 :(得分:1)
为了方便起见,我扩展了@Martin Tirion版本:
这是更改后的代码:
namespace StackOwerflow.Sample.Helpers
{
public static class UIElementExtensions
{
public static T FindControl<T>( this UIElement parent, string ControlName ) where T : FrameworkElement
{
if( parent == null )
return null;
if( parent.GetType() == typeof(T) && (( T )parent).Name == ControlName )
{
return ( T )parent;
}
T result = null;
int count = VisualTreeHelper.GetChildrenCount( parent );
for( int i = 0; i < count; i++ )
{
UIElement child = ( UIElement )VisualTreeHelper.GetChild( parent, i );
if( FindControl<T>( child, ControlName ) != null )
{
result = FindControl<T>( child, ControlName );
break;
}
}
return result;
}
}
}
修改后,我可以这样使用:
var combo = parent.FindControl<ComboBox>("ComboBox123");
或当父级是当前对话框时,如下所示:
var combo = FindControl<ComboBox>("ComboBox123");
再次感谢@Martin Tirion!
答案 2 :(得分:0)
在XAML中创建Control时,可以为其指定x:Name="..."
标记。在相应的C#类中,Control将以该名称提供
像Grid这样的一些容器视图有一个Children
属性,你可以使用它来搜索它们内部的控件。