C# 如何通过标识符(名称、Uid…)访问用户控件?

C# 如何通过标识符(名称、Uid…)访问用户控件?,c#,wpf-controls,xname,C#,Wpf Controls,Xname,我已经构建了许多(到目前为止有16个)用户控件实例。 它们的每一个都有相似的性质。我给每个人起了一个名字: x:Name=“probeX”(其中x是一个整数)。 每个控件都代表一个电子探针 我想写一个方法,可以通过传递int值访问用户控件,访问他的一个属性 例如: 如果方法签名为: void SetMeasuredValueToProbe(内部探头编号,内部值) 然后经过 将测量值设置为探针(3,22) 将“probe3”特定属性设置为值22 我知道我可以在一个方法中创建长的switch cas

我已经构建了许多(到目前为止有16个)用户控件实例。 它们的每一个都有相似的性质。我给每个人起了一个名字: x:Name=“probeX”(其中x是一个整数)。 每个控件都代表一个电子探针

我想写一个方法,可以通过传递int值访问用户控件,访问他的一个属性

例如: 如果方法签名为: void SetMeasuredValueToProbe(内部探头编号,内部值) 然后经过 将测量值设置为探针(3,22)

将“probe3”特定属性设置为值22

我知道我可以在一个方法中创建长的switch case。 但在未来,我希望以指数方式增加探测器的数量。 因此,我想知道命名和访问用户控件数组的正确方法是什么

XAML:


我想知道这样做的优雅方式,而不必制作意大利面代码。

一种方法可以是给根
网格
一个
x:Name

<Grid x:Name="LayoutRoot">
    ...
</Grid>

...
然后在代码中,可以按名称找到探测用户控件。大概是这样的:

var probe = LayoutRoot.GetChildByName<ProbeTestControl>($"probe{probe_number}");
var probe=LayoutRoot.GetChildByName($“probe{probe\u number}”);
以下是我使用的扩展方法:

public static T GetChildByName<T>(this FrameworkElement element, string name)
    where T : FrameworkElement
{
    if (element == null) return null;
    return (T)element.FindName(name) ?? element.GetChildrenOfType<T>().FirstOrDefault(c => c.Name == name);
}

public static IEnumerable<T> GetChildrenOfType<T>(this DependencyObject element)
    where T : DependencyObject
{
    return element.GetChildrenRecursive().OfType<T>();
}

private static IEnumerable<DependencyObject> GetChildrenRecursive(this DependencyObject element)
{
    if (element == null)
    {
        throw new ArgumentNullException(nameof(element));
    }

    for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
    {
        var child = VisualTreeHelper.GetChild(element, i);

        yield return child;

        foreach (var item in child.GetChildrenRecursive())
        {
            yield return item;
        }
    }
}
public static T GetChildByName(此FrameworkElement元素,字符串名称)
其中T:FrameworkElement
{
if(element==null)返回null;
return(T)element.FindName(name)??element.GetChildrenOfType().FirstOrDefault(c=>c.name==name);
}
公共静态IEnumerable GetChildrenOfType(此DependencyObject元素)
其中T:DependencyObject
{
返回元素。GetChildrenRecursive(),类型为();
}
私有静态IEnumerable GetChildrenRecursive(此DependencyObject元素)
{
if(元素==null)
{
抛出新ArgumentNullException(nameof(element));
}
for(变量i=0;i
只要所有探测都存在于同一个XAML树中,一切都应该正常工作

我希望这有帮助

var probe = LayoutRoot.GetChildByName<ProbeTestControl>($"probe{probe_number}");
public static T GetChildByName<T>(this FrameworkElement element, string name)
    where T : FrameworkElement
{
    if (element == null) return null;
    return (T)element.FindName(name) ?? element.GetChildrenOfType<T>().FirstOrDefault(c => c.Name == name);
}

public static IEnumerable<T> GetChildrenOfType<T>(this DependencyObject element)
    where T : DependencyObject
{
    return element.GetChildrenRecursive().OfType<T>();
}

private static IEnumerable<DependencyObject> GetChildrenRecursive(this DependencyObject element)
{
    if (element == null)
    {
        throw new ArgumentNullException(nameof(element));
    }

    for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
    {
        var child = VisualTreeHelper.GetChild(element, i);

        yield return child;

        foreach (var item in child.GetChildrenRecursive())
        {
            yield return item;
        }
    }
}