由于使用Style更改滑动条样式没生效,遂通过c#代码通过逻辑树获取元素的方式来进行样式修改,以此博客记录。注意点就是目标元素的生成和渲染时间。
AttachedToVisualTree事件在控件被添加到视觉树时触发,然而,对于ScrollViewer这类复杂控件,其内部结构(即控件模板)的构建是异步的。当MyDeviceDetailView的AttachedToVisualTree触发时,ScrollViewer自身的模板可能还未实例化,其内部的PART_Frame自然还不存在。
public MyDeviceDetailView(){InitializeComponent();AttachedToVisualTree += (sender, e) =>{var scrollViewer = this.FindControl<ScrollViewer>("Viewer");if (scrollViewer != null){// 监听ScrollViewer自身的附加事件scrollViewer.AttachedToVisualTree += (s, e) =>{Dispatcher.UIThread.Post(() =>{// 在此处查找PART_Framevar targetBorder = scrollViewer.GetVisualDescendants().OfType<Border>().FirstOrDefault(x => x.Name == "PART_Frame");if (targetBorder != null){targetBorder.Background = new SolidColorBrush(Color.Parse("#eb5a10"));}}, DispatcherPriority.Loaded);};}};}