亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過標識符(Name、Uid...)訪問用戶控件?

如何通過標識符(Name、Uid...)訪問用戶控件?

C#
婷婷同學_ 2023-12-17 10:30:00
我已經構建了許多(到目前為止 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;                               }                 }我想知道在不編寫意大利面條代碼的情況下執行此操作的優雅方法。
查看完整描述

1 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

一種方法可能是向根提供x:Name Grid:


<Grid x:Name="LayoutRoot">

    ...

</Grid>

然后在您的代碼中,您可以按名稱找到探針用戶控件。像這樣的東西:


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;

        }

    }

}

只要所有探測器都存在于同一個 XAML 樹中,一切都應該有效。


我希望這有幫助。


查看完整回答
反對 回復 2023-12-17
  • 1 回答
  • 0 關注
  • 173 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號