FindVisualChild参考问题

我找到并修改了以下代码,以便使用iTextSharp类将我的dataGrid导出为pdf文档。

private void ExportToPdf(DataGrid grid) { PdfPTable table = new PdfPTable(grid.Columns.Count); using (Document doc = new Document(iTextSharp.text.PageSize.A4)) { using (PdfWriter writer = PdfWriter.GetInstance(doc, new System.IO.FileStream("Test.pdf", FileMode.Create))) { doc.Open(); for (int j = 0; j < grid.Columns.Count; j++) { table.AddCell(new Phrase(grid.Columns[j].Header.ToString())); } table.HeaderRows = 1; IEnumerable itemsSource = grid.ItemsSource as IEnumerable; if (itemsSource != null) { foreach (var item in itemsSource) { DataGridRow row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; if (row != null) { DataGridCellsPresenter presenter = FindVisualChild(row); for (int i = 0; i < grid.Columns.Count; ++i) { DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(i); TextBlock txt = cell.Content as TextBlock; if (txt != null) { table.AddCell(new Phrase(txt.Text)); } } } } doc.Add(table); doc.Close(); } } } } 

问题发生在以下行:

 DataGridCellsPresenter presenter = FindVisualChild(row); 

Visual Studio返回以下错误’名称’FindVisualChild’在当前上下文中不存在’。 如何添加此参数?

WPF框架不提供FindVisualChild方法,您必须添加它们。 可能你想要这个:

 public static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject { if (depObj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { DependencyObject child = VisualTreeHelper.GetChild(depObj, i); if (child != null && child is T) { yield return (T)child; } foreach (T childOfChild in FindVisualChildren(child)) { yield return childOfChild; } } } } public static childItem FindVisualChild(DependencyObject obj) where childItem : DependencyObject { foreach (childItem child in FindVisualChildren(obj)) { return child; } return null; } 

在某些实用程序类中添加这些方法,以便可以重用它们。

通常的做法是使用这些方法(由Rohit Vats发布)作为扩展方法,如下所示:

 static class Utils { public static IEnumerable FindVisualChildren(this DependencyObject depObj) where T : DependencyObject { ... } public static childItem FindVisualChild(this DependencyObject obj) where childItem : DependencyObject { ... } } 

然后在你的代码中:

 using Utils; class MyCode { public static DataGridCellsPresenter GetPresenter(DataGridRow row) { return row.FindVisualChild(); } }