第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何按類型獲取WPF容器的子項(xiàng)?

如何按類型獲取WPF容器的子項(xiàng)?

C#
暮色呼如 2019-08-09 10:28:55
如何按類型獲取WPF容器的子項(xiàng)?我怎樣才能類型的子控件ComboBox中MyContainer Grid的WPF?<Grid x:Name="MyContainer">                         <Label Content="Name"  Name="label1"  />     <Label Content="State" Name="label2"  />     <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox1"/>     <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox3" />     <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox4" /></Grid>這行給了我一個(gè)錯(cuò)誤:var myCombobox = this.MyContainer.Children.GetType(ComboBox);
查看完整描述

3 回答

?
蝴蝶刀刀

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊

兒童是UIElements的集合。因此,您需要迭代項(xiàng)目并確定每個(gè)項(xiàng)目是否屬于所需類型。幸運(yùn)的是,已經(jīng)有一個(gè)Linq方法就是這樣,即Enumerable.OfType<T>可以使用Extension Method語(yǔ)法方便地調(diào)用它:

var comboBoxes = this.MyContainer.Children.OfType<ComboBox>();

此方法根據(jù)類型過濾集合,并在您的情況下僅返回類型的元素ComboBox。

如果您只想要第一個(gè)ComboBox(如您的變量名可能建議的那樣),您只需追加FirstOrDefault()對(duì)查詢的調(diào)用:

var myComboBox = this.MyContainer.Children.OfType<ComboBox>().FirstOrDefault();


查看完整回答
1 反對(duì) 回復(fù) 2019-08-09
?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

此擴(kuò)展方法將遞歸搜索所需類型的子元素:

public static T GetChildOfType<T>(this DependencyObject depObj) 
    where T : DependencyObject{
    if (depObj == null) return null;

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

        var result = (child as T) ?? GetChildOfType<T>(child);
        if (result != null) return result;
    }
    return null;}

所以使用它你可以要求MyContainer.GetChildOfType<ComboBox>()。


查看完整回答
反對(duì) 回復(fù) 2019-08-09
?
搖曳的薔薇

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊

所有這些答案,但一個(gè)使用遞歸,IMO只是跛腳:)

獲得視覺孩子:

public static IEnumerable<T> FindVisualChildren<T>([NotNull] this DependencyObject parent) where T : DependencyObject{
    if (parent == null)
        throw new ArgumentNullException(nameof(parent));

    var queue = new Queue<DependencyObject>(new[] {parent});

    while (queue.Any())
    {
        var reference = queue.Dequeue();
        var count = VisualTreeHelper.GetChildrenCount(reference);

        for (var i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(reference, i);
            if (child is T children)
                yield return children;

            queue.Enqueue(child);
        }
    }}

讓邏輯兒童:

public static IEnumerable<T> FindLogicalChildren<T>([NotNull] this DependencyObject parent) where T : DependencyObject{
    if (parent == null)
        throw new ArgumentNullException(nameof(parent));

    var queue = new Queue<DependencyObject>(new[] {parent});

    while (queue.Any())
    {
        var reference = queue.Dequeue();
        var children = LogicalTreeHelper.GetChildren(reference);
        var objects = children.OfType<DependencyObject>();

        foreach (var o in objects)
        {
            if (o is T child)
                yield return child;

            queue.Enqueue(o);
        }
    }}

注意,這兩個(gè)深遍歷樹,如果你想停止在第一次相遇,然后同時(shí)更改代碼調(diào)用包括對(duì)queue.Enqueueelse塊。


查看完整回答
反對(duì) 回復(fù) 2019-08-09
  • 3 回答
  • 0 關(guān)注
  • 759 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)