421事件内容WPF打印控件内容
当我们想打印控件内容时,如⼀个Grid中的内容,可以⽤WPF中PrintDialog类的PrintVisual()⽅法来实现
界⾯如下:
XAML代码如下
1<Grid>
2<Grid.ColumnDefinitions>
3<ColumnDefinition/>
4<ColumnDefinition Width="300"/>
5</Grid.ColumnDefinitions>
6<Grid Grid.Column="0">
7
8<Grid Width="800" Name="grid1">
9<TextBlock TextWrapping="Wrap" FontSize="15">
10                Control authors who want to customize the arrange pass of layout processing should override this method. The implementation pattern should call M:System.Windows.UIElement.Arrange(System.Windows.Rect) on each visible chil
11 Many derived classes offer implementations of this method. Prominent ones include: M:System.Windows.Window.ArrangeOverride(System.Windows.Size), M:System.Windows.Controls.Page.ArrangeOverride(System.Windows.Size) and M:S 12</TextBlock>
13</Grid>
14</Grid>
15
16<Grid Grid.Column="1">
17<Button Height="30" VerticalAlignment="Top" Click="Button_Click">打印</Button>
18</Grid>
19</Grid>
当我们点击按钮时,进⾏打印
按钮事件:
PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() == true)
{
pd.id1, "");
}
这时我们会发现,虽然打印的内容是指定的,但打印的⼤⼩却是整个窗体的⼤⼩,⽽不仅仅是指定的区域⼤⼩。
然后我们就需要⽤到UIElement的Arrange ⽅法
MSDN上的解释是
定位⼦元素,并确定的⼤⼩。⽗元素从它们的实现(或者是 WPF 框架级别等效项)调⽤此⽅法,以便形成递归布局更新。此⽅法产⽣第⼆次布局更新。
修改后的代码如下:
1if (pd.ShowDialog() == true)
2            {
4                pd.id1, "");
5            }
这样操作以后,打印的⼤⼩不再是整个窗体的⼤⼩了,但打印完之后,控件的位置却发⽣了变化,这时候我们只需要再调⽤⼀次Arrange⽅法,将它放回原来的位置就⾏了
1if (pd.ShowDialog() == true)
2            {
3                Window window = Window.GetWindow(grid1);
4                Point point = grid1.TransformToAncestor(window).Transform(new Point(0, 0));//获取当前控件的坐标
7                pd.id1, "");
设置为原来的位置
9            }
这样就可以打印控件内容了。
如果想对打印机进⾏设置,可以查 WPF PrintDialog的使⽤⽅法,下⾯是简单的设置
1                PrintTicket pt = new PrintTicket();
2                PageMediaSize p = new PageMediaSize(PageMediaSizeName.ISOA4);
3//pt.PageBorderless = PageBorderless.Unknown;
4                pt.PageMediaSize = p;
5//pt.PageOrientation = PageOrientation.Portrait;
6                pd.PrintTicket = pt;
希望能帮助到有需要的⼈。