Silverlight以及Windows Phone:解析元素在Visual Tree和Logical Tree中的位置

來源:互聯網
上載者:User

看看在標準的Silverlight下和Silverlight For Windows Phone中怎樣解析元素在Visual Tree和Logical Tree中的位置。以前也過一篇在Windows 8 WinRT架構下同樣意圖的文章:WinRT/Metro:解析元素在Visual Tree和Logical Tree中的位置。由於WinRT在介面XAML上和Silverlight極為相似,因此那篇WinRT文章的代碼基本適用於Silverlight。因為不管是WinRT還是Silverlight,相比WPF,他們都沒有LogicalTreeHelper類型,UIElement的上一級也不是Visual類型,FrameworkElement沒有LogicalChildren屬性……

 

在Silverlight下:

兩個列表是一樣的,簡單明了(沒有像WPF那樣嵌套一大堆東西)

 

在Windows Phone下:

 

 

介面XAML:

<Grid>

    <Grid.ColumnDefinitions>

        <ColumnDefinition/>

        <ColumnDefinition/>

    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>

        <RowDefinition Height="auto"/>

        <RowDefinition/>

    </Grid.RowDefinitions>

    <TextBlock>Logical Tree</TextBlock>

    <TextBlock Grid.Column="1">Visual Tree</TextBlock>

    <ListBox Name="lbxLogical" Grid.Row="1"/>

    <ListBox Name="lbxVisual" Grid.Row="1" Grid.Column="1"/>

</Grid>

 

擷取Visual Tree和Logical Tree代碼:

IEnumerable<DependencyObject> GetVisualTree(DependencyObject obj)

{

    var list = new List<DependencyObject>() { obj };

    var res = obj;

    while ((res = VisualTreeHelper.GetParent(res)) != null)

        list.Add(res);

    return list.AsEnumerable().Reverse();

}

 

IEnumerable<DependencyObject> GetLogicalTree(DependencyObject obj)

{

    var list = new List<DependencyObject>() { obj };

    var res = obj;

    while ((res = GetParent(res)) != null)

        list.Add(res);

 

    return list.AsEnumerable().Reverse();

}

 

DependencyObject GetParent(DependencyObject obj)

{

    var ff = obj as FrameworkElement;

    if (ff != null)

        return ff.Parent;

    return null;

}

 

最後在相應Loaded事件內執行(分別解析兩個ListBox做樣本)

lbxLogical.ItemsSource = GetLogicalTree(lbxLogical).Select(d => d.GetType().Name);

lbxVisual.ItemsSource = GetVisualTree(lbxVisual).Select(d => d.GetType().Name);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.