C# 如果数据为“0”,则无法将wpf视图正确导出到xps;“太多”;
问题C# 如果数据为“0”,则无法将wpf视图正确导出到xps;“太多”;,c#,wpf,export,xpsdocument,C#,Wpf,Export,Xpsdocument,问题 所以,我正在构建我的应用程序,以便它的视图可以导出到和Xps文档中。该应用程序实际上只是UserControl的ItemsControl 它可以正常工作,直到我向ItemsControl添加更多数据,导出的文件只是显示一个“未完成”的加载视图 这是我导出到xps的代码: public static void CreatePortableFile(List<N_SheetPageVM> numberedSheetPages, string path) {
所以,我正在构建我的应用程序,以便它的视图可以导出到和Xps文档中。该应用程序实际上只是
UserControl
的ItemsControl
它可以正常工作,直到我向ItemsControl
添加更多数据,导出的文件只是显示一个“未完成”的加载视图
这是我导出到xps的代码:
public static void CreatePortableFile(List<N_SheetPageVM> numberedSheetPages, string path)
{
List<N_SheetPageV> sheetPages = new List<N_SheetPageV>();
foreach (N_SheetPageVM item in numberedSheetPages)
{
N_SheetPageV temp = new N_SheetPageV();
temp.DataContext = item;
sheetPages.Add(temp);
}
List<FixedPage> fixedPages = new List<FixedPage>();
foreach (N_SheetPageV item in sheetPages)
{
FixedPage newFixedPage = new FixedPage();
newFixedPage.Children.Add(item);
fixedPages.Add(newFixedPage);
}
List<PageContent> pageContents = new List<PageContent>();
foreach (FixedPage item in fixedPages)
{
PageContent newPageContent = new PageContent();
((System.Windows.Markup.IAddChild)newPageContent).AddChild(item);
pageContents.Add(newPageContent);
}
FixedDocument fixedDoc = new FixedDocument();
foreach (PageContent item in pageContents)
{
fixedDoc.Pages.Add(item);
}
XpsDocument xpsDoc = new XpsDocument(path, FileAccess.Write);
XpsDocumentWriter xWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
xWriter.Write(fixedDoc);
xpsDoc.Close();
}
public static void CreatePortableFile(List<S_SheetPageVM> stavedSheetPages, string path)
{
List<S_SheetPageV> sheetPages = new List<S_SheetPageV>();
foreach (S_SheetPageVM item in stavedSheetPages)
{
sheetPages.Add(new S_SheetPageV() { DataContext = item });
}
List<FixedPage> fixedPages = new List<FixedPage>();
foreach (S_SheetPageV item in sheetPages)
{
FixedPage newFixedPage = new FixedPage();
newFixedPage.Children.Add(item);
fixedPages.Add(newFixedPage);
}
List<PageContent> pageContents = new List<PageContent>();
foreach (FixedPage item in fixedPages)
{
PageContent newPageContent = new PageContent();
((System.Windows.Markup.IAddChild)newPageContent).AddChild(item);
pageContents.Add(newPageContent);
}
FixedDocument fixedDoc = new FixedDocument();
foreach (PageContent item in pageContents)
{
fixedDoc.Pages.Add(item);
}
XpsDocument xpsDoc = new XpsDocument(path, FileAccess.Write);
XpsDocumentWriter xWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
xWriter.Write(fixedDoc);
xpsDoc.Close();
}
publicstaticvoid CreatePortableFile(列表编号的页,字符串路径)
{
列表页=新列表();
foreach(N_SheetPageVM项目在numberedSheetPages中)
{
N_SheetPageV temp=新N_SheetPageV();
temp.DataContext=项目;
添加(临时);
}
List fixedPages=新列表();
foreach(N_SheetPageV页面中的项目)
{
FixedPage newFixedPage=新FixedPage();
newFixedPage.Children.Add(项);
添加(newFixedPage);
}
List pageContents=新列表();
foreach(固定页面中的固定页面项)
{
PageContent newPageContent=新的PageContent();
((System.Windows.Markup.IAddChild)newPageContent.AddChild(item);
pageContents.Add(newPageContent);
}
FixedDocument fixedDoc=新的FixedDocument();
foreach(页面内容中的页面内容项)
{
固定Doc.Pages.Add(项目);
}
XpsDocument xpsDoc=新的XpsDocument(路径,FileAccess.Write);
XpsDocumentWriter=XpsDocument.CreateXpsDocumentWriter(xpsDoc);
xWriter.Write(fixedDoc);
xpsDoc.Close();
}
公共静态void CreatePortableFile(列表StateSheetPages,字符串路径)
{
列表页=新列表();
foreach(S_SheetPageVM项目在StateSheetPages中)
{
添加(新的S_SheetPageV(){DataContext=item});
}
List fixedPages=新列表();
foreach(S_SheetPageV页中的项目)
{
FixedPage newFixedPage=新FixedPage();
newFixedPage.Children.Add(项);
添加(newFixedPage);
}
List pageContents=新列表();
foreach(固定页面中的固定页面项)
{
PageContent newPageContent=新的PageContent();
((System.Windows.Markup.IAddChild)newPageContent.AddChild(item);
pageContents.Add(newPageContent);
}
FixedDocument fixedDoc=新的FixedDocument();
foreach(页面内容中的页面内容项)
{
固定Doc.Pages.Add(项目);
}
XpsDocument xpsDoc=新的XpsDocument(路径,FileAccess.Write);
XpsDocumentWriter=XpsDocument.CreateXpsDocumentWriter(xpsDoc);
xWriter.Write(fixedDoc);
xpsDoc.Close();
}
屏幕截图
1。小数据截图 下面的屏幕截图显示,如果数据较小,则正确地将其导出到xps中: 2。意外的大数据屏幕截图 下面的屏幕截图显示,如果数据“大”,则它被错误地导出到xps中: 3。预期大数据截图(导出前拍摄) 这是“大”数据的预期输出(来自应用程序的屏幕截图,预导出,因为导出操作不正确) 附加细节
也许解决方案会稍微延迟导出过程以等待加载完成(即使它们实际上都是同步过程,在这个项目中没有异步) 另外,如果你需要完整的源代码,我很乐意在私人房间里与你分享
谢谢。我注意到您在文档中放置的项目上设置了
DataContext
。这表明内容包含绑定,在这种情况下,问题可能是在导出文档时绑定目标尚未更新
数据绑定在DataBind
(级别8)的DispatcherPriority
进行处理。为了确保数据在导出文档时实际可用,需要将导出安排在处理绑定后进行。您还需要确保您的内容已经过布局。您可以通过将导出安排在DispatcherPriority.Loaded
(第6级)进行来完成这两项,该导出在DataBind
之后运行,优先级与布局相同
尝试按如下方式更新导出方法:
List<N_SheetPageV> sheetPages = new List<N_SheetPageV>();
foreach (N_SheetPageVM item in numberedSheetPages)
{
N_SheetPageV temp = new N_SheetPageV();
temp.DataContext = item;
sheetPages.Add(temp);
}
...
Dispatcher.CurrentDispatcher.Invoke(
DispatcherPriority.Loaded,
new Action(
() =>
{
XpsDocument xpsDoc = new XpsDocument(path, FileAccess.Write);
XpsDocumentWriter xWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
xWriter.Write(fixedDoc);
xpsDoc.Close();
})
);
List sheetPages=新列表();
foreach(N_SheetPageVM项目在numberedSheetPages中)
{
N_SheetPageV temp=新N_SheetPageV();
temp.DataContext=项目;
添加(临时);
}
...
迪帕特
public static void CreatePortableFile(List<MyViewModelVM> myViewModels, string path)
{
FixedDocument fixedDoc = new FixedDocument();
foreach (MyViewModelVM item in myViewModels)
{
//idem
}
DocumentViewer dummy = new DocumentViewer(); //it's the key
dummy.Document = fixedDoc; //it's the key
Dispatcher.CurrentDispatcher.Invoke (new Action (delegate { }), DispatcherPriority.ApplicationIdle, null);
WriteToXps(path, fixedDoc)
}