2013-04-25 32 views
11

Tôi đã gặp khó khăn khi in bằng cách sử dụng không gian tên System.Printing. Cuối cùng tôi đã tìm ra rằng lý do tôi nhận được kết quả trống khi sử dụng các phần của API là do các đối tượng Visual mà tôi đang cố gắng in không được Nạp/Khởi tạo. Nếu tôi hiển thị các đối tượng Visual bằng cách đặt chúng vào một kích thước thích hợp Window s và gọi Show() trước khi in, sau đó tôi nhận được kết quả mong đợi.Cách thích hợp để buộc tải một hình ảnh WPF

Như vậy, workaround tôi đã đưa ra là để gọi phương pháp này cho tất cả các trực quan

public static void ShowVisual(Visual visual) 
{ 
    Window window = new Window 
     { 
      Content = visual, 
      SizeToContent = SizeToContent.WidthAndHeight, 
      Visibility = Visibility.Hidden 
     }; 
    window.Show(); 
    window.Close(); 
} 


Điều này có vẻ giống như một hack, đặc biệt là kể từ khi người dùng thấy một thời gian ngắn hòa Window-frame. Tôi nghĩ rằng phải có một cách khác mà nó được cho là phải làm. Tuy nhiên, tôi không bật lên bất kỳ giải pháp nào khác. Đang sử dụng một cửa sổ ẩn thực sự những gì được cho là phải được thực hiện ở đây?

Sử dụng MenuItem như mô tả tại WPF - Get size of UIElement in Memory? không hoạt động. Tôi nhìn vào Force rendering of a WPF control in memory nhưng tôi không thực sự muốn hiển thị trực quan đến một bitmap mà có vẻ là những gì được cho. Gọi số ApplyTemplate() trên số Image như được mô tả trong wpf force to build visual tree không giúp được gì.


EDIT: Đây là giải pháp được sử dụng thay vì ShowVisual từ trên

/// <remarks> 
/// This method needs to be called in order for 
// the element to print visibly at the correct size. 
/// </remarks> 
private static void ArrangeElement(UIElement element) 
{ 
    var box = new Viewbox {Child = element}; 

    box.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
    box.Arrange(new Rect(box.DesiredSize)); 
} 

Trả lời

4

Các mặt hàng bạn muốn in cần phải được bổ sung vào cây thị giác trong WPF để các Đo và Sắp xếp các quy trình được gọi trên tất cả các phần tử trong cây trực quan mà bạn muốn hiển thị/in hoặc hiển thị theo cách khác.

Tôi chưa thực hiện việc này trong một thời gian nhưng bạn có thể thấy rằng việc thêm các mục này vào ViewPort trong nền và sau đó in chúng giải quyết được vấn đề. Điều này sẽ nhận được xung quanh sự cần thiết cho thực sự hiển thị chúng trên màn hình và do đó người dùng nhìn thấy chúng trong khi cũng buộc các quy trình đo/sắp xếp.

+0

Cảm ơn thông tin. Tôi không thể tìm thấy một lớp 'ViewPort' nhưng cuối cùng bạn đã dẫn tôi đến giải pháp. Tôi đã thử câu trả lời tại [Lấy kích thước của UIElement trong bộ nhớ] (http://stackoverflow.com/a/4890217/1072626) một lần nữa nhưng sử dụng một 'StackPanel' thay vì' MenuItem' chỉ vì'StackPanel' có 'Viewport {Height | Width} 'thành viên. Điều đó hiệu quả. – vossad01

+0

Rất tiếc, tôi xin lỗi vì tôi muốn nói 'Viewbox'. Có một cách viết hữu ích [lên đây] (http://wpftutorial.net/ViewBox.html). Vui mừng bạn đã nhận nó được sắp xếp mặc dù. – Jammer

3

Tôi đã gặp vấn đề tương tự. Trong trường hợp của tôi, tôi chỉ gọi: Visual.UpdateLayout() trước khi thử làm việc với nó. Như đã nói bởi Jammer, nó sẽ tự động buộc các quy trình Measure/Arrange.

Tôi đã làm điều đó trên cửa sổ. Nếu bạn có bất kỳ vấn đề, bạn có thể nên thiết lập Visual Height và chiều rộng trước khi gọi UpdateLayout().

Eric

0

Tôi gặp vấn đề tương tự. Được giải quyết bởi ApplyTemplate().

Nó buộc xây dựng cây trực quan của phần tử khung.

Các vấn đề liên quan