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(); } }