您的位置:首页 > 其它

When theme change,the control tree is changed.

2011-03-30 11:59 405 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐