2014-09-27 3 views
0

다음과 같은 요구 사항이 있습니다. 화면에 표시된 화면 요소를 프린터로 인쇄하려고합니다. 구현은 MVVM을 통해 수행됩니다. 그래서 화면의 인쇄 버튼을 클릭하면 인쇄 대화 상자가 표시되고 프린터를 선택하면 모든 UI 요소 인쇄가 진행됩니다. 나는 해결책을 선물로 시도했다 print WPF visual from viewmodel에 있지만 한계가 누락되어 제대로 표시되지 않는다.wpf에서보기 모델의 인쇄 대화 상자

또 다른 프리뷰를보기 위해 인쇄 미리보기 대화 상자가 표시되어야하는 인쇄 미리보기가있다.

미리 감사드립니다.

감사합니다. 크리슈나.

+0

UI 인쇄는 ViewModel과 관련이 없습니다. 모든 UI 요소에 액세스 할 수있는 코드 숨김에 print 메서드를 구현하기 만하면됩니다. 끝난. – Will

답변

0

내 생각에 MVVM 응용 프로그램에서보기 인쇄는 ViewModel의 책임이나 관심사가 아닙니다. 나는 당신이보기에서 이것을하는 것이 낫다고 믿습니다.

버튼에서 WPF 비헤이비어를 사용하는 방법 - 뷰에 DataTemplates를 사용하고 '코드 숨김'파일이 없기 때문에 비헤이비어를 사용합니다.

동작은 DependencyProperty를 노출합니다.이 속성은 인쇄 할 내용이나 인쇄 할 내용을 바인딩합니다.

XAML :

<Button Margin="0,2,5,2" 
     HorizontalAlignment="Right" 
     Content="PRINT" 
     ToolTip="Prints the current report"> 
    <i:Interaction.Behaviors> 
     <b:ReportPrintClickBehavior Content="{Binding ElementName=SelectedReportContent, Mode=OneWay}" /> 
    </i:Interaction.Behaviors> 
</Button> 

는 XAML의 행동을 참조하려면, 당신은 System.Windows.Interactivity를 참조해야합니다,이는 NuGet here에서 찾을 수 있습니다.

코드 숨김 (행동) :이 경우

나는 FlowDocumentFlowDocumentReader 내에서 호스팅 인쇄하고 있습니다.

public sealed class ReportPrintClickBehavior : Behavior<Button> 
{ 
    public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", 
     typeof(DependencyObject), 
     typeof(ReportPrintClickBehavior), 
     new PropertyMetadata(null)); 

    public DependencyObject Content 
    { 
     get { return (DependencyObject)GetValue(ContentProperty); } 
     set { SetValue(ContentProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     AssociatedObject.Loaded += OnLoaded; 
     AssociatedObject.Unloaded += OnUnloaded; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 

     AssociatedObject.Loaded -= OnLoaded; 
     AssociatedObject.Unloaded -= OnUnloaded; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs args) 
    { 
     AssociatedObject.Click += OnClick; 
    } 

    private void OnUnloaded(object sender, RoutedEventArgs args) 
    { 
     AssociatedObject.Click -= OnClick; 
    } 

    private void OnClick(object sender, RoutedEventArgs args) 
    { 
     var flowDocumentReader = Content.GetVisualDescendent<FlowDocumentReader>(); 
     if (flowDocumentReader != null) 
     { 
      flowDocumentReader.Print(); 
     } 
    } 
} 
+0

의견을 보내 주셔서 감사합니다. 나는 별도의 옵션으로 인쇄 미리보기를 표시하는 방법을 사용하고 있습니다.이 방법을 사용하면 어떻게 할 수 있습니까? –

+0

당신은 WPF가 출력을 WYSIWYG로 인쇄 할 때 정직하게 사용하지 않아도됩니다. – AwkwardCoder

+0

나쁜 .. WPF 마이그레이션 프로젝트에 Windows Forms에서 일하고 있는데 그들은 그들의 고전적인 Forms 기반 버전에서 그 옵션을 가지고 있었고 그들은 WPF 프로젝트에서도 같은 기능을 가질 것으로 기대하고 있습니다. 그리고 나는 여기에 붙어 있습니다. 그러나 많은 감사합니다. 모든 답변 –