2014-09-27 51 views
0

我有一个要求如下,我想打印到屏幕上的屏幕元素。通过MVVM完成实现。所以如果我点击屏幕上的打印按钮,它应该显示一个打印对话框,选择打印机应该继续打印所有UI元素及其数据。我已尝试解决方案目前在print WPF visual from viewmodel,但其遗漏的余地和不正常显示从wpf中查看模型的printdialogue

另外我还有另一个按钮打印预览应该显示打印预览对话,以查看预览。

在此先感谢。

关心, 克里希纳。

+0

打印UI并不是ViewModel的关注点。只需在代码隐藏中实现打印方法,即可访问所有UI元素。完成。 – Will 2014-09-29 12:56:12

回答

0

在我看来,在MVVM应用程序中打印View并不是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找到。

代码隐藏(行为):

在这种情况下,我打印主办的FlowDocumentReaderFlowDocument

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

感谢您的建议,它应该适合我。我还剩下另一件事,因为单独的选项是关于显示打印预览,我们怎么才能得到这种方法 – 2014-09-29 10:17:34

+0

你没有,说实话,你不需要它,因为WPF将输出打印为WYSIWYG – AwkwardCoder 2014-09-29 10:20:13

+0

我的坏..我正在从Windows窗体转移到WPF迁移项目,他们在他们的经典基于表单的版本中有这个选项,他们期望在WPF项目中也有相同的功能,并且我被困在这里..但非常感谢你所有的回应 – 2014-09-29 10:29:56