WPF實現可視化控制項列印及列印預覽

来源:https://www.cnblogs.com/s0611163/archive/2018/12/20/10147705.html
-Advertisement-
Play Games

列印預覽XAML代碼: <controls:WindowEx x:Class="SunCreate.Vipf.Client.UI.MapPrintPreview" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xm ...


列印預覽XAML代碼:

<controls:WindowEx x:Class="SunCreate.Vipf.Client.UI.MapPrintPreview"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:controls="clr-namespace:SunCreate.Common.Controls;assembly=SunCreate.Common.Controls"
             mc:Ignorable="d" 
             d:DesignHeight="700" d:DesignWidth="1000" Loaded="WindowEx_Loaded">
    <Window.Resources>
        <ResourceDictionary>
            <!-- 文字按鈕 -->
            <Style x:Key="stlTxtBtn" TargetType="{x:Type Button}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border Background="Transparent">
                                <Border x:Name="bd" Background="{TemplateBinding Background}" CornerRadius="2" Padding="{TemplateBinding Padding}">
                                    <TextBlock x:Name="txt" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5 2 5 2"  Foreground="White" ><InlineUIContainer>
                                            <ContentPresenter />
                                        </InlineUIContainer></TextBlock>
                                </Border>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsMouseOver" Value="true">
                                    <Setter TargetName="bd" Property="Background" Value="#33c4f5"/>
                                </Trigger>
                                <Trigger Property="IsPressed" Value="true">
                                    <Setter TargetName="txt" Property="FontSize" Value="11"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="38"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Border Background="#f0f0f0">
            <Button x:Name="btnPrint" Margin="10 0 0 0" Background="#1aa4f5" Width="60" Height="28" HorizontalAlignment="Left" FontSize="12" Style="{StaticResource stlTxtBtn}" Click="btnPrint_Click" Content="列印"></Button>
        </Border>
        <Border Grid.Row="1" Background="#a0a0a0">
            <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                <!-- 該Border設置成固定A4紙大小 -->
                <Border Background="#fff" Margin="10" Width="842" Height="595">
                    <!-- 該Border可縮放至列印紙 -->
                    <Border x:Name="border">
                        <Image x:Name="img" Margin="10" Stretch="Uniform" Source="{Binding Image}" HorizontalAlignment="Left" VerticalAlignment="Top" ></Image>
                    </Border>
                </Border>
            </ScrollViewer>
        </Border>
    </Grid>
</controls:WindowEx>
View Code

列印預覽後臺代碼(註意:列印的是Border不是Image):

using SunCreate.Common.Controls;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Printing;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace SunCreate.Vipf.Client.UI
{
    /// <summary>
    /// 地圖列印預覽
    /// </summary>
    public partial class MapPrintPreview : WindowEx
    {
        /// <summary>
        /// 需要列印預覽的控制項
        /// </summary>
        private FrameworkElement _element;

        private BitmapImage _Image;
        public BitmapImage Image
        {
            get
            {
                return _Image;
            }
            set
            {
                _Image = value;
                OnPropertyChanged("Image");
            }
        }

        public MapPrintPreview(FrameworkElement element)
        {
            InitializeComponent();
            this.DataContext = this;
            _element = element;
        }

        private void WindowEx_Loaded(object sender, RoutedEventArgs e)
        {
            int width = (int)_element.ActualWidth;
            int height = (int)_element.ActualHeight;
            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
            renderTargetBitmap.Render(_element);
            BmpBitmapEncoder bmpBitmapEncoder = new BmpBitmapEncoder();
            bmpBitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
            MemoryStream memoryStream = new MemoryStream();
            bmpBitmapEncoder.Save(memoryStream);
            memoryStream.Position = 0;
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.BeginInit();
            bitmapImage.StreamSource = memoryStream;
            bitmapImage.EndInit();
            Image = bitmapImage;
        }

        private void btnPrint_Click(object sender, RoutedEventArgs e)
        {
            PrintDialog printDialog = new PrintDialog();
            printDialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
            if (printDialog.ShowDialog() == true)
            {
                printDialog.PrintVisual(border, "列印地圖");
            }
        }

    }
}
View Code

列印預覽效果圖(說明:地圖沒數據所以都是空白;地圖下麵空白,是因為地圖尺寸長寬比例和A4紙比例不同,縮放到A4紙):

 

點擊“列印”彈出系統的列印對話框。這個功能做的不是很理想,只是簡單實現了預覽與列印,沒有達到我想要的效果。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ADO.NET 巨集觀定義 傳統ADO主要針對緊密連接的客戶端/伺服器端系統,而 ADO.NET考慮到了斷開連接式應用並且引進了 Dateset 它代表任意數量的關聯表,其中每個表都包含了行和列的集合的本地副本。使用Dateset的話.在斷開資料庫連接的情況下調用程式集(如 web 頁面或者桌面可執行 ...
  • 參數含義:ABURL:要下載的AB包地址 go:用於測試,顯示載入貼圖 assetName:要載入的資源名稱 (在調用之前要對參數初始化) ...
  • 技術交流,請加QQ群:538327407 我的各種github 開源項目和代碼:https://github.com/linbin524 背景 筆者 目前架構的IOT 項目是使用abp 框架作為後臺,雖然abp的框架適用於中小型項目框架,但由於架構優美,筆者認為還是可以經過改造,作為大型項目中使用。 ...
  • 目前Web開發,大部分公司都用的是前後端分離模式,即前端專註於前端頁面交互,後端專註於功能實現及提供Web Api介面。 在某次新站點的開發過程中,為了網站的安全性,要求Web站點使用https協議,在部署到QA環境時,發現調用介面報如下的錯: 從提示的內容來看,大致可推斷出是因為站點是https協 ...
  • 前言 解析Excel有知名的NPOI庫,(Java語言是POI),但是NPOI是不支持解析csv的。 csv本質上也是文本文件,可以進行差異對比,更利於解決衝突。 本文對解析csv的幾個.net的開源庫進行調研 很小巧簡單的庫:https://github.com/stevehansen/csv/ ...
  • RabbitMQ配置環境花費了好多時間,特記錄此筆記,方便下次部署安裝。筆記中將常見的安裝錯誤問題、解決辦法與安裝過程一同展示。 ...
  • 第一次寫隨筆 應該寫的不是太好 請多多見諒 我這次是在網上發現了一個三級聯動 也是給新人一個福利 這個是你需要新建個 JavaScript 文件 並複製到你新建的文件裡面 1 var provinces = [ 2 { 3 "name": "北京市", 4 "city": [ 5 { 6 "name ...
  • 環境 本地 win7 伺服器:Virtual Box 上的Centos ssh工具: Xshell 文件傳輸: xftp 1.在本地創建asp.net core應用發佈 1.1 使用Vs2017 新建一個asp.netcore項目 步驟略(一路next),當然你也可以用命令行創建。 1.2 發佈項目 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...