Mvvm wpf中视图模型的打印对话

Mvvm wpf中视图模型的打印对话,mvvm,printing,viewmodel,Mvvm,Printing,Viewmodel,我有如下要求,我想把屏幕上的屏幕元素打印到打印机上。实现是通过MVVM完成的。因此,如果我单击屏幕上的打印按钮,它将显示一个打印对话框,选择打印机将继续打印所有UI元素及其数据。我尝试过目前的解决方案,但它缺少边框,显示不正确 另外,我还有一个按钮打印预览,它应该显示打印预览对话框来查看预览 提前谢谢 问候,, 克里希纳 在我看来,在MVVM应用程序中打印视图不是ViewModel的责任或关注点。我相信从这个角度来看,你做得更好 我以前是如何在按钮上使用WPF行为的——我使用行为是因为我在视图中

我有如下要求,我想把屏幕上的屏幕元素打印到打印机上。实现是通过MVVM完成的。因此,如果我单击屏幕上的打印按钮,它将显示一个打印对话框,选择打印机将继续打印所有UI元素及其数据。我尝试过目前的解决方案,但它缺少边框,显示不正确

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

提前谢谢

问候,,
克里希纳

在我看来,在MVVM应用程序中打印视图不是ViewModel的责任或关注点。我相信从这个角度来看,你做得更好

我以前是如何在按钮上使用WPF行为的——我使用行为是因为我在视图中使用DataTemplates,并且没有“代码隐藏”文件

该行为公开了DependencyProperty,这是对要打印的内容或包含要打印的内容的绑定

XAML:


谢谢你的建议,对我来说应该没问题。我还有一件事要做,作为一个单独的选项,就是显示打印预览,我们怎么能在这种方法中得到它呢,老实说,你不需要它,因为WPF将输出打印为WYSIWYGMy bad..我正在做一个Windows窗体到WPF的迁移项目,他们在基于窗体的经典版本中有这个选项,他们希望WPF项目中也有相同的功能,我被困在这里..但是非常感谢你打印UI的所有响应不是ViewModel关心的问题。只需在codebehind中实现print方法,在这里您可以访问所有UI元素。完成。
<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>
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();
        }
    }
}