猿问

如何通过标识符(Name、Uid...)访问用户控件?

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


我想编写一个方法,可以通过将 int 值传递到其属性之一来访问用户控件。


例如: 如果方法签名是: 无效SetMeasuredValueToProbe(intprobe_number,int值) 然后经过 设置测量值到探针(3, 22);


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


我知道我可以在方法内制作长开关盒。 但将来我想成倍增加探测器的数量。 所以我想知道命名和访问用户控件数组的正确方法是什么。


XAML:


    <StackPanel

        Grid.Column="0">

        <uc:ProbeTestControl x:Name="probe1" x:Uid="1" ProbeValue ="1"/>

        <uc:ProbeTestControl x:Name="probe2" ProbeValue ="2"/>

        <uc:ProbeTestControl x:Name="probe3" ProbeValue ="3"/>

        <uc:ProbeTestControl x:Name="probe4" ProbeValue ="4"/>

        <uc:ProbeTestControl x:Name="probe5" ProbeValue ="5"/>

        <uc:ProbeTestControl x:Name="probe6" ProbeValue ="6"/>

        <uc:ProbeTestControl x:Name="probe7" ProbeValue ="7"/>

        <uc:ProbeTestControl x:Name="probe8" ProbeValue ="8"/>

    </StackPanel>

    <StackPanel

        Grid.Column="1">

        <uc:ProbeTestControl x:Name="probe9" ProbeValue ="9"/>

        <uc:ProbeTestControl x:Name="probe10" ProbeValue ="10"/>

        <uc:ProbeTestControl x:Name="probe11" ProbeValue ="11"/>

        <uc:ProbeTestControl x:Name="probe12" ProbeValue ="12"/>

        <uc:ProbeTestControl x:Name="probe13" ProbeValue ="13"/>

        <uc:ProbeTestControl x:Name="probe14" ProbeValue ="14"/>

        <uc:ProbeTestControl x:Name="probe15" ProbeValue ="15"/>

        <uc:ProbeTestControl x:Name="probe16" ProbeValue ="16"/>

    </StackPanel>

MainWindow 类中的方法:


    private void SetMeasuredValueToProbe(int probe_number, int value )

    {

        switch (probe_number)

        {

            case 1:

                probe1.MeasuredValueBox = value;

                break;

            case 2:

                probe2.MeasuredValueBox = value;

                break;

            default:

                break;                       

        }             

    }

我想知道在不编写意大利面条代码的情况下执行此操作的优雅方法。



婷婷同学_
浏览 117回答 1
1回答

眼眸繁星

一种方法可能是向根提供x:Name Grid:<Grid x:Name="LayoutRoot">&nbsp; &nbsp; ...</Grid>然后在您的代码中,您可以按名称找到探针用户控件。像这样的东西:var probe = LayoutRoot.GetChildByName<ProbeTestControl>($"probe{probe_number}");这是我使用的扩展方法:public static T GetChildByName<T>(this FrameworkElement element, string name)&nbsp; &nbsp; where T : FrameworkElement{&nbsp; &nbsp; if (element == null) return null;&nbsp; &nbsp; return (T)element.FindName(name) ?? element.GetChildrenOfType<T>().FirstOrDefault(c => c.Name == name);}public static IEnumerable<T> GetChildrenOfType<T>(this DependencyObject element)&nbsp; &nbsp; where T : DependencyObject{&nbsp; &nbsp; return element.GetChildrenRecursive().OfType<T>();}private static IEnumerable<DependencyObject> GetChildrenRecursive(this DependencyObject element){&nbsp; &nbsp; if (element == null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; throw new ArgumentNullException(nameof(element));&nbsp; &nbsp; }&nbsp; &nbsp; for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var child = VisualTreeHelper.GetChild(element, i);&nbsp; &nbsp; &nbsp; &nbsp; yield return child;&nbsp; &nbsp; &nbsp; &nbsp; foreach (var item in child.GetChildrenRecursive())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield return item;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}只要所有探测器都存在于同一个 XAML 树中,一切都应该有效。我希望这有帮助。
随时随地看视频慕课网APP
我要回答