When theme change,the control tree is changed.

When use   ListView, i want to find it's child :scrollViewer.use code as bellow:

svALlItems = (ScrollViewer)(VisualTreeHelper.GetChild(lvAllItems, 0) as Border).Child;

when change theme from areo to non-aero ,for example as classic theme, application crash,the reason at above statement.

Use VisualTreeHelper to see VisualTree,The method  as bellow:

string GetVisualTreeInfo(DependencyObject target)
{
    int i = 0;
    int childCount = 0;
    DependencyObject parentObject = target;
    DependencyObject childObject = null;
    string format = "Rank:{0}    childIndex:{1}   {2}   ";
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.AppendLine("VisualTree:");
    while (true)
    {
        childCount = VisualTreeHelper.GetChildrenCount(parentObject);
        if (childCount == 0) break;
 
        for (int j = 0; j < childCount; j++)
        {
            childObject = VisualTreeHelper.GetChild(parentObject, j);
            stringBuilder.AppendLine(string.Format(format, i, j, childObject));
        }
 
        if (childObject == null) break;
        parentObject = childObject;
        i++;
    }
    Debug.WriteLine(stringBuilder.ToString());
    return stringBuilder.ToString();
}

When aero theme,visualTree is :

Rank:0    childIndex:0   System.Windows.Controls.Border 
Rank:1    childIndex:0   System.Windows.Controls.ScrollViewer 
Rank:2    childIndex:0   System.Windows.Controls.Grid 
Rank:3    childIndex:0   System.Windows.Shapes.Rectangle 
Rank:3    childIndex:1   System.Windows.Controls.ScrollContentPresenter  
Rank:3    childIndex:2   System.Windows.Controls.Primitives.ScrollBar Minimum:0 Maximum:0 Value:0  
Rank:3    childIndex:3   System.Windows.Controls.Primitives.ScrollBar Minimum:0 Maximum:0 Value:0  

When non-aero theme,as classic, visualTree is :

Rank:0    childIndex:0   Microsoft.Windows.Themes.ClassicBorderDecorator   
Rank:1    childIndex:0   System.Windows.Controls.ScrollViewer  
Rank:2    childIndex:0   System.Windows.Controls.Grid  
Rank:3    childIndex:0   System.Windows.Shapes.Rectangle  
Rank:3    childIndex:1   System.Windows.Controls.ScrollContentPresenter  
Rank:3    childIndex:2   System.Windows.Controls.Primitives.ScrollBar Minimum:0 Maximum:0 Value:0  
Rank:3    childIndex:3   System.Windows.Controls.Primitives.ScrollBar Minimum:0 Maximum:0 Value:0  

the first child is different ,so when we use VisualTreeHelper like this,plase take  care !~

the above statement should change  as fllow:

 var svALlItems = (ScrollViewer)(VisualTreeHelper.GetChild(listView1, 0) as Decorator).Child;

posted @   xiaokang088  阅读(321)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示