WPF uygulamasında, diğer denetimler arasında, bir DocumentViewer
bulunan belirli bir Window
var.Farklı bir UI iş parçacığı içinde bir DocumentViewer içeriğini yazdırma
Bu pencere açıldığında ve yüklendiğinde, bir ilerleme göstergesiyle FixedDocument
dinamik olarak oluşturur ve ardından DocumentViewer
içinde görüntüler. Çalışır ve kullanıcı deneyimini geliştirmek için, bu pencereyi kendi iş parçacığıyla çalıştırıyorum, böylece ana uygulama penceresi belge oluşturulurken hala yanıt veriyor.
public void ShowDocumentViewerWindow(params object[] data) {
var thread = new Thread(() => {
var window = new MyDocumentViewerWindow(new MyObject(data));
window.Closed += (s, a) => window.Dispatcher.InvokeShutdown();
window.Show();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
Ben şimdiye kadar bu kurulum ile mutlu olmuştur, ama sadece bir sorun ile karşılaştım: this web page bahşişlere dayanarak
, böyle yeni bir iş parçacığı benim pencere açmak. Ben kendi iş parçacığı pencere vardı önce
<Button Command="Print" CommandTarget="{Binding ElementName=MyDocumentViewer}">Print</Button>
, bu iyi çalıştı:
MyDocumentViewerWindow
System.Windows.Threading.Dispatcher.Run();
yığın izleme böyle başlıyor:
at System.Windows.Threading.Dispatcher.VerifyAccess()
at MS.Internal.Printing.Win32PrintDialog.ShowDialog()
at System.Windows.Controls.PrintDialog.ShowDialog()
at System.Printing.PrintQueue.GatherDataFromPrintDialog(PrintDialog printDialog, XpsDocumentWriter&amp; writer, PrintTicket&amp; partialTrustPrintTicket, PrintQueue&amp; partialTrustPrintQueue, Double&amp; width, Double&amp; height, String jobDescription)
at System.Printing.PrintQueue.CreateXpsDocumentWriter(String jobDescription, PrintDocumentImageableArea&amp; documentImageableArea)
at System.Windows.Controls.Primitives.DocumentViewerBase.OnPrintCommand()
at System.Windows.Controls.Primitives.DocumentViewerBase.ExecutedRoutedEventHandler(Object target, ExecutedRoutedEventArgs args)
...
Benim önsezi yazdırma iletişim ana UI iş parçacığı açılıyor ve oluşturulan belgeyi erişmeye çalışıyor ve olunan olmasıdır kendi iş parçacığım, dolayısıyla kaza.
Bunu nasıl çözebilirim? Pencereyi kendi ipliğinde tutmak istiyorum.
Bunun için teşekkürler. Belge oluşturma, bir FixedDocument örneğini oluşturmayı, FixedPage nesneleri eklemeyi, bunları denetimleriyle doldurmayı vb. Içerir. FixedDocument bir DispatcherObject olduğundan, bir arka plan iş parçacığı içinde oluşturamadım ve sonra da bunu oluşturulduğu gibi DocumentViewer için kaynak olarak ayarlayamadım. çapraz iş parçacığı ihlali. Belgeimi, Document Viewer'ımla aynı konuya, yani bir UI iş parçacığıyla oluşturmam gerektiğini buldum :-(Ama sorunumun bir geçici çözümünü buldum - şimdi göndereceğim. – Ross