一般来说,如果一个界面定义了一个模板样式,都能通过 this.FindResource("") 来找到对应的样式元素
但是如果样式绑定在资源控件上,如动画等
则需要利用可视数找到对应的资源控件,再通过资源控件的样式找到对应的样式元素
资源样式:
<ControlTemplate x:Key="Template1">
<Border>
<Grid x:Name="Grid1"/>
<Border>
</ControlTemplate>
控件样式:
<telerik:cc Template="{StaticResource Template1}" Name="C1"/>
要找到Grid1,则需可视树:FindChild(“”)
static T FindChild<T>(DependencyObject parent,string childName) where T :DependencyObject
{
if (parent == null) return null;
T foundChild = null;
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(parent,i);
T childType = child as T;
if (childType == null)
{
foundChild = FindChild<T>(child,childName);
if(foundChild!= null) break;
}
else if(!string.IsNullOrEmpty(childName))
{
var frameworkElement = child as FrameworkElement;
//控件名称符合参数条件
if (frameworkElement != null && frameworkElement.Name == childName)
{
foundChild = (T)child;
break;
}
}
else
{
foundChild = (T)child;
break;
}
}
}
//找到资源控件
cc c1 = FindChild<cc>(Application.Current.MainWindow,"C1");
Grid g = c1.Template.FindName("Grid1",c1) as Grid;
有时候,查找资源时会调用: this.ApplyTemplate();
在Application.Current中找不到资源的话,需要先对资源进行加载:
var foo = new Uri("xxx.xaml",Urikind.RelativeOrAbsoulute);
Application.Current.Resource.MergedDictionaries.Add(new ResourceDictionary{Source=foo});
参考:
How to: Find DataTemplate-Generated Elements - WPF .NET Framework | Microsoft Docs
How to: Find ControlTemplate-Generated Elements - WPF .NET Framework | Microsoft Docs