如何在代码中删除/禁用DocumentViewer中的打印按钮(当在自己的线程上时)?

时间:2016-11-23 07:01:38

标签: wpf multithreading print-preview documentviewer

我在后台线程中运行以下代码作为STA公寓,在文档查看器中提供打印预览:

 // Print Preview
        public static void PrintPreview(FixedDocument fixeddocument)
        {
            MemoryStream ms = new MemoryStream();

            using (Package p = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite))
            {
                Uri u = new Uri("pack://TemporaryPackageUri.xps");

                PackageStore.AddPackage(u, p);

                XpsDocument doc = new XpsDocument(p, CompressionOption.Maximum, u.AbsoluteUri);

                XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);

                writer.Write(fixeddocument.DocumentPaginator);

                var previewWindow = new Window();
                var docViewer = new DocumentViewer();
                previewWindow.Content = docViewer;

    THIS FAILS --->   docViewer.CommandBindings.Remove(???Print Button???);

                FixedDocumentSequence fixedDocumentSequence = doc.GetFixedDocumentSequence();
                docViewer.Document = fixedDocumentSequence as IDocumentPaginatorSource;

                previewWindow.ShowDialog();

                PackageStore.RemovePackage(u);
                doc.Close();
            }
        }

一切运作良好。但是,由于它在自己的线程中运行 - 而不是主线程 - 文档查看器上的打印对话框崩溃。

在代码中,如何删除和/或禁用来自DocumentViewer的“打印”按钮? (我已经阅读了我在Google上可以找到的所有内容,而这一切都在XAML中,并不是很有帮助。)

非常感谢任何帮助。 TIA

更新#1:我能看到的唯一方法是从控件模板中删除“打印”按钮并使用自定义文档查看器。 Document Viewer Style给出了一种可行的风格。

如果我只是从系统文档查看器中删除按钮,那仍然会很好吗?

1 个答案:

答案 0 :(得分:0)

使用此答案中的method,您可以像这样以编程方式更改PrintButton的可见性。假设我将方法放在名为UIElementHelper的类中:

     var button = UIElementHelper.FindChild<Button>(docViewer, "PrintButton");
     button.Visibility = Visibility.Collapsed;