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