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;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步