我有一个要求如下,我想打印到屏幕上的屏幕元素。通过MVVM完成实现。所以如果我点击屏幕上的打印按钮,它应该显示一个打印对话框,选择打印机应该继续打印所有UI元素及其数据。我已尝试解决方案目前在print WPF visual from viewmodel,但其遗漏的余地和不正常显示从wpf中查看模型的printdialogue
另外我还有另一个按钮打印预览应该显示打印预览对话,以查看预览。
在此先感谢。
关心, 克里希纳。
我有一个要求如下,我想打印到屏幕上的屏幕元素。通过MVVM完成实现。所以如果我点击屏幕上的打印按钮,它应该显示一个打印对话框,选择打印机应该继续打印所有UI元素及其数据。我已尝试解决方案目前在print WPF visual from viewmodel,但其遗漏的余地和不正常显示从wpf中查看模型的printdialogue
另外我还有另一个按钮打印预览应该显示打印预览对话,以查看预览。
在此先感谢。
关心, 克里希纳。
在我看来,在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找到。
代码隐藏(行为):
在这种情况下,我打印主办的FlowDocumentReader
内FlowDocument
。
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();
}
}
}
感谢您的建议,它应该适合我。我还剩下另一件事,因为单独的选项是关于显示打印预览,我们怎么才能得到这种方法 – 2014-09-29 10:17:34
你没有,说实话,你不需要它,因为WPF将输出打印为WYSIWYG – AwkwardCoder 2014-09-29 10:20:13
我的坏..我正在从Windows窗体转移到WPF迁移项目,他们在他们的经典基于表单的版本中有这个选项,他们期望在WPF项目中也有相同的功能,并且我被困在这里..但非常感谢你所有的回应 – 2014-09-29 10:29:56
打印UI并不是ViewModel的关注点。只需在代码隐藏中实现打印方法,即可访问所有UI元素。完成。 – Will 2014-09-29 12:56:12