Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果数据为“0”,则无法将wpf视图正确导出到xps;“太多”;_C#_Wpf_Export_Xpsdocument - Fatal编程技术网

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。预期大数据截图(导出前拍摄) 这是“大”数据的预期输出(来自应用程序的屏幕截图,预导出,因为导出操作不正确)

附加细节


  • 实际上,即使只是应用程序的正常“加载”,屏幕上显示的第一件事就是屏幕截图2,但随后会显示3。这就是为什么我想问题出在装载上
  • 我检查了加载方法(每个类1个),即:清除viewmodel数据,然后将模型重新分配到它的viewmodel中。而且它的电话号码是正确的,所以没有重复的电话
  • 如果您需要亲自查看,那么我提供了指向意外和预期输入和输出文件以及.exe的下载链接
  • 为什么我要引用“太多”或“太多”?因为我觉得太多了
  • 没有异步方法
  • 如果需要,您可以请求实际的C#项目
  • 页面排列由用户手动完成(在最后一个页面之后添加或删除新页面),由一个类似于PageVM的集合处理
  • 不需要完整的MVVM方法
  • 我预测的解决方案会是什么样子


    也许解决方案会稍微延迟导出过程以等待加载完成(即使它们实际上都是同步过程,在这个项目中没有异步)

    另外,如果你需要完整的源代码,我很乐意在私人房间里与你分享


    谢谢。

    我注意到您在文档中放置的项目上设置了
    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)
    }