Today I am explaining that how
you can print a Banner or Text in WPF using F#. Document, Banner or Text
Printing Needs a PrintDialogBox and Print Commands. Here in F# you need only write code and add some References to Perform
a print operation. Steps are given Below.
If you want to Print the Text or Banner. You will write the below code Block
// For
Printing Text or Banner
let
stk = new StackPanel()
let
wndw = new Window(Title="How
to Print Banner In WPF using F#",
SizeToContent = SizeToContent.WidthAndHeight,
Content=stk)
let
txtbx = new TextBox(Width=250.0,
Margin= new
Thickness(12.0))
txtbx |> stk.Children.Add |> ignore
let
butn = new Button(Content =
"Click To Print ",
Margin =
new Thickness(12.0),
HorizontalAlignment = HorizontalAlignment.Center)
butn |> stk.Children.Add |> ignore
butn.Click.Add(fun _ ->
let dlg = new
PrintDialog()
let retval = dlg.ShowDialog().GetValueOrDefault()
if retval then
let prntkt = dlg.PrintTicket
prntkt.PageOrientation <- new Nullable<PageOrientation>(PageOrientation.Portrait)
If you want to Create newBanner
Paginator Object. The below Code Block will Work.
// Create
new BannerDocumentPaginator object.
let
paginator = new DocPrintBann(Text=txtbx.Text)
paginator.PageSize <- new
Size(dlg.PrintableAreaWidth,
dlg.PrintableAreaHeight)
dlg.PrintDocument(paginator, "Banner: "
+ txtbx.Text))
txtbx.Focus() |>ignore
Note: The Complete code
you can see in Step 4.
Step 1: Firstly Open a new project in F#
using Visual Studio 2010. Select F# WPF Application template and give name to the
project like below image.
Step 2: Now add below
given references to your project by right clicking on your project in solution
explorer.
PresentationCore
PresentationFramework
ReachFramework
System
System.Printing
System.Xaml
WindowsBase
Step 3: When you add all
these References, your Solution Explorer will look like below image.
Step 4: Then click on
Program.fs file in Solution Explorer and write below given code in Program.fs
window, Your window will look like below images.
#light
open System
open
System.Globalization
open
System.Printing
open
System.Windows
open
System.Windows.Controls
open
System.Windows.Documents
open
System.Windows.Input
open
System.Windows.Media
type
DocPrintBann() = class
inherit DocumentPaginator()
let mutable
text = ""
let mutable
fce = new Typeface("")
let mutable
mxSze = new Size(0.0,0.0)
let mutable (sizePage:Size)
= new Size(0.0,0.0)
let gtFrmtTxt (ch:char) (face:Typeface) (em:double)
=
new FormattedText(ch.ToString(),
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
face,
em,
Brushes.Black)
member this.Text
with get() = text
and set value = text <-value
member this.Typeface
with get() = fce
and set value = fce <-value
override this.IsPageCountValid
with get() =
text.ToCharArray() |> Seq.iter (fun ch
->
let formtxt = gtFrmtTxt ch
fce 100.0
mxSze.Width <- Math.Max(mxSze.Width,formtxt.Width)
mxSze.Height <- Math.Max(mxSze.Height ,formtxt.Height )
)
true
override this.PageCount
with get() = if
text = null then
0 else text.Length
override this.PageSize
with get() = sizePage
and set value = sizePage <- value
override this.Source
with get() = null
override this.GetPage (numPage) =
let vsDrw = new
DrawingVisual()
using (vsDrw.RenderOpen()) (fun dc
->
let factor =
Math.Min((this.PageSize.Width - 96.0) / mxSze.Width,
(this.PageSize.Height - 96.0) / mxSze.Height)
let formtxt = gtFrmtTxt (text.Chars
numPage) fce (factor*100.0)
let ptText =
new Point((this.PageSize.Width - formtxt.Width) / 2.0,
(this.PageSize.Height - formtxt.Height) / 2.0)
dc.DrawText(formtxt,ptText))
//
new DocumentPage(vsDrw)
end
//
For Printing Text or Banner
let
stk = new StackPanel()
let
wndw = new Window(Title="How
to Print Banner In WPF using F#",
SizeToContent = SizeToContent.WidthAndHeight,
Content=stk)
let
txtbx = new TextBox(Width=250.0,
Margin= new
Thickness(12.0))
txtbx |> stk.Children.Add |> ignore
let
butn = new Button(Content =
"Click To Print ",
Margin = new
Thickness(12.0),
HorizontalAlignment = HorizontalAlignment.Center)
butn |> stk.Children.Add |> ignore
butn.Click.Add(fun _ ->
let dlg = new
PrintDialog()
let retval = dlg.ShowDialog().GetValueOrDefault()
if retval then
let prntkt = dlg.PrintTicket
prntkt.PageOrientation <- new Nullable<PageOrientation>(PageOrientation.Portrait)
// Create new BannerDocumentPaginator object.
let paginator =
new DocPrintBann(Text=txtbx.Text)
paginator.PageSize <- new
Size(dlg.PrintableAreaWidth,
dlg.PrintableAreaHeight)
dlg.PrintDocument(paginator, "Banner: "
+ txtbx.Text))
txtbx.Focus() |>ignore
#if
COMPILED
[<STAThread()>]
do
let app = Application()
in
app.Run(wndw) |> ignore
#endif
Step 5: Now press F5 to
execute the code.
Output
Summary
In this article I have
Discussed that how to Print a Banner or Text in WPF using F#.