如何在代码后置中使用WPF模板?附DataTemplate代码示例
在WPF CodeBehind中使用DataTemplate的几种方法
嘿,我来帮你搞定这个问题!你已经在XAML里定义了带x:Key="currencyColumn"的DataTemplate,要在CodeBehind里用它,主要分这几个场景:
1. 从当前控件/窗口的资源中获取模板并应用
如果你的DataTemplate是定义在当前Window/UserControl的<Resources>里,直接用FindResource就能拿到,然后把它赋值给需要的控件属性(比如ItemTemplate、CellTemplate等)。
举个例子,把模板应用到DataGrid的列:
// 获取模板,注意强转成DataTemplate var currencyTemplate = (DataTemplate)FindResource("currencyColumn"); // 创建一个DataGrid模板列,把模板赋值给CellTemplate DataGridTemplateColumn currencyColumn = new DataGridTemplateColumn(); currencyColumn.Header = "Currency"; currencyColumn.CellTemplate = currencyTemplate; // 添加到DataGrid的列集合里 yourDataGridInstance.Columns.Add(currencyColumn);
如果是给ListBox用:
yourListBox.ItemTemplate = currencyTemplate;
2. 从外部ResourceDictionary中获取模板
如果你的模板是放在单独的ResourceDictionary文件里,得先加载这个字典再获取模板:
// 加载ResourceDictionary var resourceDict = new ResourceDictionary(); resourceDict.Source = new Uri("pack://application:,,,/YourAssemblyName;component/Resources/YourResourceDict.xaml", UriKind.Absolute); // 获取模板 var currencyTemplate = (DataTemplate)resourceDict["currencyColumn"]; // 之后的应用方式和上面一样
3. 访问模板内的控件(比如你的TextBox "total")
如果需要操作模板里的TextBox(比如修改样式、获取值),得等到模板被实例化后,通过FindName方法查找,这里需要借助可视化树遍历:
首先写个辅助方法用来查找可视化子元素:
private T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is T typedChild) { return typedChild; } var nestedChild = FindVisualChild<T>(child); if (nestedChild != null) { return nestedChild; } } return null; }
然后在合适的时机(比如控件加载完成后)查找模板里的TextBox:
// 假设你的模板应用在某个ContentPresenter上(比如DataGridCell里) var presenter = FindVisualChild<ContentPresenter>(yourTargetControl); if (presenter != null && presenter.ContentTemplate == currencyTemplate) { var totalTextBox = (TextBox)presenter.ContentTemplate.FindName("total", presenter); if (totalTextBox != null) { // 这里可以操作这个TextBox了,比如设置焦点或者修改文本 totalTextBox.Foreground = Brushes.Red; } }
注意:一定要等到模板被实例化后再去查找控件,比如在Loaded事件里操作,不然会找不到哦!
内容的提问来源于stack exchange,提问作者reonZ
相关产品推荐
相关产品推荐

