• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 8/2/2020 11:38:31 PM'Basit' Yazılım Dili
  • 6/25/2020 3:18:13 PMderleme hatası
  • 12/11/2017 4:49:15 PMWindows Hizmeti Hk.
  • 4/23/2016 12:55:33 AMC programlama 2 oyun

Popüler Sorular

  • 5/27/2012 5:49:50 AMAsp.Net ile Date time alana veri ekleyemiiyorum ?
  • 4/2/2012 12:45:18 AM.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 5/12/2012 8:44:49 AMAcil Yardım
  • 5/27/2012 1:46:51 PMveri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LibreOffice
  • LINQ
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

WPF'de Yazdırma (Print) ve Önizleme (Print Preview) İşlemleri

Uygulamalarımız hangi sektöre, hangi amaca hitap ederse etsin genellikle yazdırma işlemlerine ihtiyaç duyulur. Bu ihtiyaç PDF Printer, XPS Printer veya Image Printer gibi sanal yazıcı uygulamalarının kullanımlarındaki artışla daha da fazla ihtiyaç haline geldi. Peki WPF arayüzlerinde yazdırma işlemlerini ve önizleme işlemlerini nasıl yapacağız?

01.03.2013

Yazar: Ahmet Çığşar (Google+)

Kategori: WPF

7399

Uygulamalarımız hangi sektöre, hangi amaca hitap ederse etsin genellikle yazdırma işlemlerine ihtiyaç duyulur. Bu ihtiyaç PDF Printer, XPS Printer veya Image Printer gibi sanal yazıcı uygulamalarının kullanımlarındaki artışla daha da fazla ihtiyaç haline geldi. Peki WPF arayüzlerinde yazdırma işlemlerini ve önizleme işlemlerini nasıl yapacağız?

Önemli : Bu yazı için hazırladığım örnek uygulamanın linkini makalenin sonunda bulabilirsiniz. İndirip inceleyebilirsiniz. Uygulamada kodlar arasında yorumlar ekledim, umarım yardımcı olur.

PrintDialog ile WPF'de Yazdırma İşlemleri

WPF'de direkt yazdırma işlemlerini PrintDialog sınıfı ile yaparız. Direkt yazdırma diyorum çünkü bu karşımıza bir önizleme penceresi açmadan direkt yazdırma penceresini çıkartacaktır. Önizleme nasıl yapılır onuda öğreneceğiz birazdan.

1. Visual Studio ile WPF uygulaması açalım. Karşımıza çıkan ana pencerenin (MainWindow) XAML alanına giderek Grid etiketini silip aşağıdaki kodları yapıştıralım.

    <Grid x:Name="anaAlan">
        <Label Content="Soyadınız *" HorizontalAlignment="Left" Margin="16,99,0,0" 
             VerticalAlignment="Top" Width="92"/>
        <TextBlock HorizontalAlignment="Left" Margin="23,21,0,0" TextWrapping="Wrap" 
             Text="Lütfen aşağıdaki başvuru formunu eksiksiz ve doğru bilgilerle doldurun." 
             VerticalAlignment="Top" Width="465" Foreground="#FF232222" TextDecorations="{x:Null}" 
             FontSize="14"/>
        <Label Content="Adınız *" HorizontalAlignment="Left" 
             Margin="16,70,0,0" VerticalAlignment="Top" Width="92"/>
        <Label Content="Cinsiyetiniz *" HorizontalAlignment="Left" 
             Margin="16,127,0,0" VerticalAlignment="Top" Width="92"/>
        <Label Content="e-Posta *" HorizontalAlignment="Left" 
             Margin="16,153,0,0" VerticalAlignment="Top" Width="92"/>
        <Label Content="Telefon&#x9;" HorizontalAlignment="Left" 
             Margin="16,179,0,0" VerticalAlignment="Top" Width="92"/>
        <Label Content="Eklemek İstedikleriniz" HorizontalAlignment="Left" 
             Margin="16,218,0,0" VerticalAlignment="Top" Width="127"/>
        <TextBox HorizontalAlignment="Left" Height="103" 
             Margin="23,249,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="471"/>
        <TextBox x:Name="txtAdiniz" HorizontalAlignment="Left" Height="23" Margin="113,70,0,0" 
              TextWrapping="Wrap" VerticalAlignment="Top" Width="150"/>
        <TextBox x:Name="txtSoyadiniz" HorizontalAlignment="Left" Height="23" Margin="113,99,0,0" 
              TextWrapping="Wrap" VerticalAlignment="Top" Width="150"/>
        <ComboBox x:Name="cbxCinsiyet" HorizontalAlignment="Left" 
              Margin="113,127,0,0" VerticalAlignment="Top" Width="150">
            <ComboBoxItem Content="Erkek"/>
            <ComboBoxItem Content="Kadın"/>
        </ComboBox>
        <TextBox x:Name="txtEposta" HorizontalAlignment="Left" Height="23" Margin="113,154,0,0" 
              TextWrapping="Wrap" VerticalAlignment="Top" Width="150"/>
        <TextBox x:Name="txtTelefon" HorizontalAlignment="Left" Height="23" Margin="113,182,0,0" 
              TextWrapping="Wrap" VerticalAlignment="Top" Width="150"/>
        <Button x:Name="btnBasvur" Content="Başvuruyu Gönder" HorizontalAlignment="Left" 
              Margin="381,380,0,0" VerticalAlignment="Top" Width="111"/>
        <Button x:Name="btnYazdir" Content="Yazdır" HorizontalAlignment="Left" 
              Margin="316,380,0,0" VerticalAlignment="Top" Width="60" Click="btnYazdir_Click"/>
        <Button x:Name="btnOnizleme" Content="Önizleme" HorizontalAlignment="Left" 
              Margin="236,380,0,0" VerticalAlignment="Top" Width="75" Click="btnOnizleme_Click"/>
    </Grid>

Grid'in adının anaAlan olduğuna dikkat edin lütfen. Ayrıca butonlarında x:Name özelliklerine gözgezdirmenizde fayda var.

Yukarıdaki kodları yapıştırdıktan sonra aşağıdaki görüntüyü elde etmeniz lazım. Eğer pencere ufak kalıyorsa  Properties penceresinden veya XAML alanından pencerenin Height ve Width özelliklerine biraz yüksek değer verin lütfen.

wpf_basvuru_form

2- Yazdır butonuna çift tıklıyor ve Click event'ine gidiyoruz. Aşağıdaki kodları yazıyoruz.

        private void btnYazdir_Click(object sender, RoutedEventArgs e)
        {
            PrintDialog formuYazdir = new PrintDialog();

            if (formuYazdir.ShowDialog() == true)
            {
                formuYazdir.PrintVisual((anaAlan), "Form Çıktısı");
            }

            else
            {
                MessageBox.Show("Hiç seçim yapılmadı. Bilginize.");
            }

        }

- formuYazdir adında bir PrintDialog nesnesi yani yazdırma işlemlerini getiren pencereyi oluşturuyoruz.
- if ile formu yazdır penceresinin açılıp seçim yapıp yapılmadığını kontrol ediyoruz.
- anaAlan adını verdiğimiz gridimizi PrintVisual metodunun kollarına atıyoruz bu şu demek anaAlan adlı etiketin içerisindekileri yazdıracağız anlamına gelir. "Form Çıktısı" yazısı ise yazdırılan   dosyanın adıdır. Dilediğinizi yazabilirsiniz. İsterseniz Adınız ve Soyadınız TextBox kontrollerindeki verileri alıp çıktı başlığı olarak kullanabilirsiniz. Hayal gücünüze kalmış.
- else durumunu yazmasanızda olur ama ben yazmak istedim.

Şimdi uygulamamızı çalıştırıp Yazdır butonuna tıkladığınızda aşağıdaki gibi bir pencere açılacaktır.

yazici_listesi

WPF'de Yazdırma Öncesi Önizleme (PrintPreview) Yapımı

Malesef WPF'de PrintPreview işlemini yerine getirmek için özel olarak hazırlanmış bir nesne yok . Öncelikle bu işlemi kendi oluşturacağınız sınıflar ve metodlar ile yapabilirsiniz. Ayrıca sırf yazdırma ve önizleme için yazılmış kontroller var (Ör: RadDiagramPrintPreview, WPF PrintPreview Engine... gibi) dilerseniz onlarıda kullanabilirsiniz ama uygulamanızda önizleme için ufak bir hileyle kendi önizleme penceremizi oluşturabiliriz. PrintPreview için nesne yok diye üzülmek yok. Yaparız olur.

1- Yazdırma Önizlemesi (PrintPreview) işleminde kullanmak için projemize yeni bir Window ekliyoruz ve adını OnIzleme yapıyoruz ve aşağıdaki minik kodu yeni Window'umuzun XAML alanına yapıştırıyoruz. Gördüğünüz gibi DocumentViewer nesnesi eklemişiz ve adını XpsOkuyu yapmışız.

    <Grid>
        <DocumentViewer  x:Name="XpsOkuyucu" />
    </Grid>

2- OnIzleme penceresindeyken F7'ye basıyoruz ve kod kısmına geçiyoruz aşağıdaki gibi kodlarımızı yazıyoruz. Kodların InitializeComponent(); kod satırından sonra geldiğine dikkat edin. Aksi halde pencere ya açılamayacak ya da açılsa bile her tarafı gri olan bir pencere açılacaktır.

    public partial class OnIzleme : Window
    {
        public OnIzleme()
        {
            InitializeComponent();

            XpsDocument okunacakBelge = new XpsDocument(@"C:\Temp\onizleme.xps", FileAccess.Read);
            XpsOkuyucu.Document = okunacakBelge.GetFixedDocumentSequence();
        }
    }

Buradaki espri şu: MainWindow'da bulunan Önizleme butonuna tıklandığında arkaplanda bir onizleme.xps dosyası oluşturacak, dosya oluştuktan sonra OnIzleme adlı yukarıdaki penceremiz açılacak ve arkaplanda oluşturduğumuz onizleme.xps dosyasını ekranda gösterecek. Kurnazca bir çözüm olsada en pratik çözümdür. Sonuçta önizleme.

Burada dikkat etmeniz gereken, ben Temp klasörü oluşturup adres gösterdim eğer Temp adında klasörünüz yoksa uygulama hata verecektir. Bu durumu tabi if ve System.IO sınıfından Directory işlemlerini kullanarak engelleyebilirdik, öyle bir klasör yoksa oluştur diyebilirdik veya sistem tempory kullan diyebilirdik ama konumuz dışında.

Yine bura için önemli son bir not: Kod karmaşası olmaması için onizleme.xps adında bir belge oluşturmasını istedim burada önemli olan oluşan dosyayı diğer pencere tarafında aynı isimle yakalayıp gösterebilmek. Dosya adı sürekli değişecek bir yapıda olabilir ve buna göre bir önlem almanız gerekebilir. Hatırlatmakta fayda var.

3- Şimdi tekrar MainWindow'umuza dönüyoruz ve Önizleme butonumuza çift tıklayarak Click eventine gidiyoruz ve aşağıdaki C# kodlarını yazıyoruz.

private void btnOnizleme_Click(object sender, RoutedEventArgs e)
        {
            Package onizlemeBilgiler = Package.Open(@"C:\Temp\onizleme.xps", FileMode.Create);

            XpsDocument onizleme = new XpsDocument(onizlemeBilgiler);

            XpsDocumentWriter xpsYazici = XpsDocument.CreateXpsDocumentWriter(onizleme);

            xpsYazici.Write(anaAlan);

            onizleme.Close();
            onizlemeBilgiler.Close();

            OnIzleme ac = new OnIzleme();
            ac.Show();
        }

Yukarıdaki kodları aşağıda satır satır açıklayalım.

//Package sınıfından onizlemeBilgiler adında nesne oluşturuyoruz ve 
//bu nesneye kayıt yerini ve ne yapacağını belirtiyoruz. 
//Package nesnesi zaten bunun içindir.
Package onizlemeBilgiler = Package.Open(@"C:\Temp\onizleme.xps", FileMode.Create);
//onizleme adında Xps nesnesi oluşturuyoruz ve gerekli bilgileri oluşturduğumuz 
//onizlemeBilgiler adlı Package nesnesinden alıyoruz.
XpsDocument onizleme = new XpsDocument(onizlemeBilgiler);
//xpsYazici adında Xps yazıcı nesnesi oluşturuyoruz ve 
//hangi dökümanı baz alacağını (onizleme) belirtiyoruz
XpsDocumentWriter xpsYazici = XpsDocument.CreateXpsDocumentWriter(onizleme);
//anaAlan adlı grid nesnemizi baz almasını ve bu nesne içerisinde olan her şeyi yazdırmasını istiyoruz.
xpsYazici.Write(anaAlan);
//Artık xps oluşturma işimiz bitti ve package nesnemizle dökümanımızı kapatmamız lazım.
            onizleme.Close();
            onizlemeBilgiler.Close();
//Solution Explorer içerisinde bulunan önceden oluşturduğumuz 
//OnIzleme adlı pencereden bir nesne oluşturuyoruz ve Show() metodu ile gösteriyoruz.
            OnIzleme ac = new OnIzleme();
            ac.Show();

Önizleme penceresinin görüntüsü:

printpreview_onizleme

İndir : Örnek Uygulamanın Kaynak Kodları

Yazar Hakkında

Ahmet Çığşar

Ahmet Çığşar

www.ahmetcigsar.com

Yazılımla geliştirme ile tanışmam 99'lu yılların sonu 2000'li yılların başına denk geliyor, profesyonel anlamda projelere katılmam ise 2006'lı yıllara denk geliyor. Enterprise projelerinde yer almam (ERP, CRM...) ise 2009'lu yıllarda. Daha önce PERL ve C++ ile başlasa da yolculuğum kısaca .NET Framework ile aşk yaşayan biriyim diyebilirim. Yazılımın bir meslekten çok bir yaşam tarzı ve bir bakış açısı olduğunu düşünüyorum.

Sosyal Medya

ORANLAR

  • 7399izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Merhaba, ellerinize sağlık çok yardımcı ol...
  • Merhaba Bu uygulama örneğinden ASP.net ...
  • Hocam Link başka sayfaya yönlendiriyor.

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 124234
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 71519
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 52079
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ