Sunteți pe pagina 1din 881

WPF 4

08.11.2011 18:48:27
WPF4_.indd 1

WPF4
Unleashed

Adam Nathan

WPF4

-
2011

WPF 4.
.

.
.
.

.

. , .

.
.
WPF 4. . . . .: -, 2011.
880., .
ISBN 978-5-93286-196-7
Windows Presentation Foundation (WPF) Windows-.

, . WPF
, , , , ,
, .
, WPF,
, .
XAML ;
WPF: , ,
, , , , ;
: ,
, , XAML,
Visual State Manager, ;
, , ;
, ,
,
, Visual Studio; ,
WPF;
, WPF Windows Forms, DirectX
ActiveX; , WPF-
Windows 7, ,
WPF .
ISBN 978-5-93286-196-7
ISBN 978-0-672-33119-0 ()
-, 2011
Authorized translation of the English edition 2010 Pearson Education. This trans
lation is published and sold by permission of Pearson Education, the owner of all rights
to publish and sell the same.
,
.
, , .

-.199034,-,16,7,
.(812) 380-5007, www.symbol.ru. N 000054 25.12.98.
04.11.2011. 70100 1/16. 55 ..

 19

I.  27

1. WPF Silverlight? 29
 30
WPF  32
WPF 35
WPF3.5 WPF3.5 SP1  36
WPF4  38
Silverlight  40
 42
2. XAML 43
XAML 45
 47
 48
 51
 52
 55
 58
Content 58
 59
 61
XAML  63
XAML  63
XAML 67
XAML2009  72
 73
 74
 75
 75
 76
 76

 77
XAML  77
 78
 81
XAML  82
 86
XML  88
XamlServices 89
XAML 92
 96
1: XML ,  97
2: , XML,
 97

3. WPF 98
 98
 100
 106
 107
 109
 111
 113
 117
 121

II. WPF- 123

4. ,
 125
 126
Height Width 126
Margin Padding 128
Visibility  131
 132
 132
 133
FlowDirection  134
 135
RotateTransform  137
ScaleTransform  139
SkewTransform  141
TranslateTransform 142
MatrixTransform 142
 143

7
 144

5.  146
Canvas  147
StackPanel 150
WrapPanel 152
DockPanel  154
Grid 158
 162
GridSplitter  165
 166
Grid  169
 171
TabPanel 171
ToolBarPanel  171
ToolBarOverflowPanel  171
ToolBarTray 171
UniformGrid 172
SelectiveScrollingGrid  172
 173
 173
 175
 177
: , ,
 182
 192

6. : , ,
 193
 193
 194
 195
 196
 200
 202
 205
MouseEventArgs  206
 207
 208
 209
StylusDevice 210
 210
 211
 212

, ,
 216
 224
 225
 228

 229
 230

7.  231
Windows 231
Window 232
Application  235
 242
 243
 246
: ClickOnce
Windows  247
Windows  249
 249
 252
 258
- 261
XAML-  263
 265
 268
 268
XAML- 271
 272

8. Windows 7 273
 273
JumpTask  275
JumpPath  282
 287
 287
 288
 289
 290
Aero Glass  292
TaskDialog 296
 299

III.  301

9.  303
 305
Button  306
RepeatButton  307
ToggleButton 308
CheckBox 308
RadioButton  309
 311
Label  311
ToolTip 312
Frame 314
 316
GroupBox 316
Expander 318
 318
10.  319
 320
DisplayMemberPath 321
ItemsPanel  322
 325
 325
ComboBox 326
ListBox  332
ListView 335
TabControl  336
DataGrid  337
 345
Menu  345
ContextMenu 347
 349
TreeView  349
ToolBar  351
StatusBar  354
 355
11. ,  356
Image 356
Text Ink 358
TextBlock  360
TextBox 362
RichTextBox 364

10

PasswordBox  364
InkCanvas 365
 367
 367
 378
 380
 383
ProgressBar  384
Slider 385
 386
Calendar  386
DatePicker 388
 389

IV.  391

12.  393
 393
 394
 395
 400
 402
 406
 406
 411
 413
13.  414
Binding 414
Binding  414
Binding XAML 417
.NET  419
 420
 422
DataContext  426
 428
 428
 431
 434
 440
 440
 443
 446
 447

11
 449
 451
XmlDataProvider 452
ObjectDataProvider  456
 459
 459
 461
 466
: Twitter XAML 469
 471

14. , ,  472
 473
 475
 481
 488
 489
 490
 492
- 493
 500

 505
 514
 517
 524
,  524
 525
 529

V.  531

15.  533
Drawing  534
Geometry 537
Pen 548
 550
Visual  552
DrawingVisual  553
Visual  556
Visual 559
Shape 566
Rectangle  568
Ellipse  569

12

Line  570
Polyline  571
Polygon  572
Path  572
, Shape 573
 575
 575
 584
 592
 594
 597
RenderTargetBitmap 597
BitmapCache 598
BitmapCacheBrush 601
 601

16.  602
 603
 607
Position  608
LookDirection 611
UpDirection 614
OrthographicCamera PerspectiveCamera  617
Transform3D  620
TranslateTransform3D  623
ScaleTransform3D 623
RotateTransform3D 627
Transform3D 630
Model3D  631
Light  632
GeometryModel3D  639
Model3DGroup  654
Visual3D 656
ModelVisual3D  656
UIElement3D 658
Viewport2DVisual3D 660
 662
Viewport3D 663
 666
Visual.TransformToAncestor 666
Visual3D.TransformToAncestor Visual3D.
TransformToDescendant 670
 674

13

17.  675
 676
 676
 677
 685
XAML- 690
 690
 698
 699
 700
 702
 703
 706
 706
 707
 708
 710
 712
 716
 720
18. ,  722
 722
SoundPlayer  723
SoundPlayerAction 724
MediaPlayer  724
MediaElement MediaTimeline 725
 727
MediaElement 728
 730
 734
 734
 737
 743

VI.  745

19.  747
Win32
WPF- 750
Win32 Webcam 750
Webcam WPF  753
 760

14

WPF
Win32- 764
HwndSource 765
 768
WindowsForms
WPF- 772
PropertyGrid  773
PropertyGrid XAML  775
WPF
Windows Forms 777
DirectX WPF 781
ActiveX
WPF- 788
 792

20.
 794
 796

 796

 799

 802

 804
 806
 806

 813

 817
 824

21.  825
 826
 826
 828
SimpleCanvas  830
SimpleStackPanel 834
OverlapPanel 837
FanCanvas 842
 847

 848

3.

Microsoft Visual Studio,


WPF-.
, Popfly,
Microsoft, Silver
light, 25 2007
PCWorld Magazine.
Microsoft (Common Langua
ge Runtime), ,
.NET WPF.
Microsoft ,
, .
WPF Unleashed (Sams, 2006),
Jolt Award 2008, Silverlight 1.0 Unleashed (Sams, 2008)
.NET and COM: The Complete Interoperability Guide (Sams, 2002).
, ASP.NET: Tips, Tutorials, and
Code (Sams, 2001), .NET Framework Standard Library Annotated Reference,
Volume 2 (Addison-Wesley, 2005) Windows Developer Power Tools (OReilly,
2006). PINVOKE.NET
Visual Studio. www.adamnathan.net
@adamnathan Twitter.

3.

3.

,
.
, ,
. ,
. , !
, ,
,
.
.
(Dwayne Need),
WPF, .

. (Robert
Hogue), (Joe Castro) (Jordan Parker)
. (David Teitlebaum),
WPF,
3D-
, (Daniel Lehenba
uer).
, ,
.
( ):
(Brian Chapman), (Beatriz de Oli
veira Costa), (Ifeanyi Echeruo), (Dan Glick),

17

(Neil Kronlage), (Rico Mariani),


(Mike Mueller), , (Lori Pearce), . (S. Rami
ni), (Rob Relyea), (Tim Rice), (Ben Ronco),
(Adam Smith), (Tim Sneath), (Da
vid Treadwell) (Paramesh Vaidyanathan).
Sams,
(Neil Rowe) (Betsy Harris),
. .
, ,
,
. ,
.
, ,
, . ,
,
! (WPF Silverlight
!)
, ,
! ,
WPF 4 , !

3.

, , .
, ,
, . ,
, .
,
. ,
, .
, ,
-

.
, ,
.
, .
: feedback@samspublishing.com
:



3.

Neil Rowe
Executive Editor
Sams Publishing
800 East 96th Street
Indianapolis, IN 46240 USA

infor
mit.com/register, ,
.

WPF 4. ! Windows Pre


sentation Foundation (WPF)
Microsoft
Windows, , - ,
, , 3D-
. WPF
, .
, Silverlight, WPF
, Windows.
WPF 2003 ( Avalon)


Windows, Windows Forms GDI. WPF
,
,
. WPF4, 2010,
.
WPF
, .
WPF- (,
.NET Reflector )
,
, . ,
WPF ,
: WPF .
- . WPF
, , ,
. :

. ,
, Windows Presentation Foundation Unlea
shed, :
,

20

, ,

WPF, ,

, ,

,

. ,
, ,
, .
, WPF 3.5, WPF 3.5 SP1 WPF 4,
, WPF.
, , WPF
, ,
.


,
Windows. ,
: ,
, ,
. ,
, .NET Framework.
, WPF,
.
.
WPF Silverlight
, , ,
Windows Phone 7 -.
,
,
, Microsoft Expression Blend.
. :
, XML eXten
sible Application Markup Language (XAML)
, .

WPF: , , ,
, , , .

21

, ,
, XAML, Visual State Manager,
..
, :
, , , .

, , ,
.

,
, Visual Studio.
, ,
,
.
, WPF.
, WPF
Windows Forms, DirectX, ActiveX .
, WPF- Win
dows7, ,
WPF .

, WPF
( , XML Paper Specification (XPS)
). , ,
, . ,
.
, , XAML C#;
C++/CLI.
XAML :
; ,
XAML, ,
; WPF
XAML, ; , XAML
, .NET- : Visual Basic, C#
-. , XAML C# ,
.


Windows Presentation
Foundation 4.0, Windows SDK Visual Studio 2010.
:

22

Windows, .NET Framework 4.0, :

Windows XP Service Pack 2 ( Media Center,


Tablet PC x64), Windows Server 2003 Servi
ce Pack 1 ( R2), Windows Vista .
.NET Framework 4.0,
Windows Vista. Windows
http://msdn.com.
, :
Windows Software Development Kit (SDK)
.NET.
http://msdn.com.
Visual Studio 2010 ;
Express, http://msdn.com.
WPF
Microsoft Expression ( Expression Blend).

Windows Vista, Windows 7
,
Windows.


, ,
http://informit.com/title/9780672331190 http://adamnathan.
net/wpf.


,
, WPF.
,
, .
.

I
:
1 WPF Silverlight?
2 XAML
3 WPF
1 WPF ,
, . 2
XAML

23

XAML-, .
3
WPF, , ,
.NET.

II WPF-
:
4 ,
5
6 : , ,

7
8 Windows 7
II ,
( ,
, Aero Glass). 4
5 ( )
. 6
, .
7
WPF
.
Windows7,
.

III
:
9
10
11 ,
III , WPF.
, .
1
, .
11.
1

(content control
items control) , -
. content control
Content, items control
Items. ,
Microsoft, . .
.

24

IV

:
12
13
14 , ,
, IV,
WPF-,
.
,
. ,
,
.

V
:
15
16
17
18 ,
WPF,
. ,
, . ,
.
WPF . WPF
, ,
, !

VI
:
19
20 1
21
VI ,
WPF- .
WPF
,
.
1

Microsoft . . .

25



, :


, -

,
.

FAQ
FAQ?
,
, .




. ,
.

, ,
,
.

,
,
, .

I
I.

1 WPF Silverlight?
2 XAML
3 WPF


WPF
WPF
Silverlight

WPF
Silverlight?
1.

,
.
, - ,
.
, .
1994 Disclosure
() . ,
, , Microsoft Outlook!
:
; ,
;
. (
.
.)
,
, ,
. , ,
.

!
(, Windows ), -, ,
iPhone, iPad, Zune, TiVo, Wii, Xbox, Windows Phone -
. , -
,
.
, . -

30

1. WPF Silverlight?


.


.
:
,
, ,
. ,

,
.
, ,

. Win32 ,
, ,
.
2006 Microsoft ,
XXI ,
. Windows Presentation Foundation (WPF).
WPF4 2010

. ,

(Minority Report),
( iPhone), WPF4
Windows7 .
- !


Windows
(Graphics Device Interface, GDI) USER
Windows1.0 1985.
! 1990- Silicon
Graphics OpenGL
Windows, .
,
,
. Microsoft DirectX, 1995,
2D-, ,
, , 3D- (
DirectX 2, 1996).
GDI, DirectX
. , GDI+, Windows XP,

31

.
, GDI.
DirectX (, Xbox),
,
. .NET ( 2002)
Windows -. Windows Forms (
GDI+)
Windows C#, Visual Basic ( )
++. ,
, GDI+
USER.
DirectX 9 Microsoft
( ,
Visual Basic), XNA
Framework. # DirectX
, .NET COM,

.
XNA Framework,

, XNA Framework Content Pipeline XNA Game Studio Express.
, Windows 3D-
( ) 90-
GDI ( DirectX
OpenGL GDI),
. : ,
,
;
; GDI .

, , WPF

.
,
.
.
,
.
,
.

32

1. WPF Silverlight?

WPF
Microsoft , ,
GDI+ USER,
, Windows Forms.
, HTML Java
Script, Windows ,

. Windows Presentation Foundation (WPF)
,

. Presentation ()
,
,
, ,
, WPF!
, WPF.
. WPF Windows,
3D-, ,

, ,

. WPF
,
.
,
.
.
,
, .
!
, ,
! WPF

. , WPF
.
. WPF Direct3D,
WPF-,
, ,
, Direct3D,
. , WPF-
,

(
).

WPF

33

WPF ( ). WPF
.
.
,
(,
).
(,
, ,
GPU , , ).
.
WPF,
Win16/Win32
25 . .NET-

XML-. WPF

XAML (eXtensible Application Markup Language
) ( ). WPF XAML
HTML
, .
. WPF
XAML ,
3D- .

; , , .
XAML .
. WPF
.
, ,
, ! ,
, ,
, ,
(!) ( ,
). ,
, WPF
() ( 14 ,
, ).
, WPF , DirectX
( ), Windows Forms (
), Adobe Flash ( ) HTML (
). , , WPF
,
, , !

34

1. WPF Silverlight?


GDI
GDI Windows XP
.
GDI. Windows Vista
GDI.

GDI . Win
dows7 GDI.

FAQ
WPF -, ?
, . #, .NET , .
, !
WPF- WPF,
, , WPF
. , WPF Windows7, XAML (. 8 Windows7).
, .

FAQ
DirectX WPF?
DirectX
3D-, . , , DirectX,
WPF-.
DirectX , . Di
rectX :
, GPU, . ,
. , DirectX
GPU, , WPF.

WPF

35

, WPF .
, , . ( , ,
.) WPF , 2D
DirectX.
, DirectX, .
GPU, .
WPF ,
Microsoft ! , . , WPF- GPU , .
, WPF DirectX . 19 ,
.

WPF
, WPF4
WPF. , 3.0!
2006 WPF3.0,
.NET Framework3.0. WPF3.5
( , ).
( 2008).
Service Pack 1 (SP1) .NET3.5, WPF
, .
2008 http://wpf.codeplex.com
Microsoft WPF Toolkit,

. WPF Toolkit
, , (
). ,
WPF Toolkit, WPF
.
WPF
.
WPF- Visual Studio 2005,
Expression Blend .
Visual Studio 2010 WPF,
WPF-!

36

1. WPF Silverlight?

Expression Blend, WPF,



. ,
WPF-
, Autodesk, SAP, Disney, Blockbuster, Roxio, AMD, Hewlett Packard,
Lenovo . Microsoft, ,
, WPF (Visual Studio,
Expression, Test and Lab Manager, Deep Zoom Composer, Songsmith, Surface,
Semblio, Robotics Studio, LifeCam, Amalga, Games for Windows LIVE Market
place, Office Communicator Attendant, Active Directory Administrative Center,
Dynamics NAV, Pivot, PowerShell ISE ).

, WPF- WPF-, Snoop, http://


snoopwpf.codeplex.com.

, WPF .

WPF3.5 WPF3.5 SP1


WPF3.5 3.5 SP1
:
3D-
UIElement3d,
3D- , ;
Viewport2DVisual3D,
2D- 3D-;
. . 16 .
DirectX WPF-
DirectX
Win32. D3DImage
Direct3D, HWND.
WPF- DirectX . . 19.
WPF
XLINQ, ,
XAML,
. .
13 .
WPF
(, ,
, ),

WPF

37

- .

, ,

(pixel shaders). . 15
.
WPF
,
,
. WriteableBitmap
,
, ! ,
,
.
,
(
(IME) ).
TextBox RichTextBox. . 11
, .
.NET-
,
WCF (Windows Communication Foun
dation) - ( basicHttpBinding)
cookie. , XAML Browser
Applications (XBAPs) WPF-
, Internet Explorer,
Firefox (
).
.NET
:
.NET ,
.NET, (,
ASP.NET); -,
.NET,
;
ClickOnce.
WPF
,
WPF- .
, ( ),
( ) ,
,
( 8)
. ,
-

38

1. WPF Silverlight?

,
(. 10
).

WPF4
WPF4 :

, Windows7
, WPF :
, (,
) ( ) .
WPF
. WPF
Microsoft Surface (,
, WPF).
WPF4 2 Surface SDK,
, Windows
Surface. . 6 : , ,
.
Windows7
, Windows 7,
, ,
, . WPF

, (Jump List)
(icon overlays),
. . 8.
WPF4
, DataGrid, Calendar DatePicker,
WPF Toolkit. . 11.

, BounceEase, ElasticEase SineEase,

.

Silverlight 3 WPF4.
Visual State Manager
Silverlight 2;

: .

, Expression Blend,
WPF Silverlight.

WPF

39

WPF


( )
(
, ).
WPF SnapsToDevicePixels,
.
,
. Silverlight ,
, UseLayoutRounding,
. WPF4.
true ,
(
), .

, !
WPF

,

96 (DPI).
. , ,
WPF, . WPF4
- ,
, ,
GDI, WPF.
, Visual Studio 2010
.
, . . 11.

.NET
.NET ,
WPF-. .NET 4.0 Visual
Studio 2010
.

WPF
.
CacheMode; . 15.

, WPF Visual Studio 2010,
WPF-.

40

1. WPF Silverlight?

FAQ
WPF 4?
,
,
Silverlight - WPF. ,
, WPF Toolkit. , BreadcrumbBar, NumericUp
Down .

FAQ
WPF Windows?
WPF API, Windows7
( ), , 8. , WPF Windows XP ( Windows, WPF).
, 3D-.
, , WPF
(Aero Windows Vista
Windows7, Luna Windows XP).
, Windows XP , WPF-.
Windows ,
, . WPF DirectX Windows XP , Windows .

Silverlight
Silverlight , .NET,
- ( Adobe Flash Flex).
Silverlight ,
WPF, . Silverlight 2007
, , WPF, . Silverlight4
2010, WPF4.
WPF Silverlight ,
, , .
, WPF-
( XBAPs),

Silverlight

41

. , Silverlight
, .
, Silverlight WPF
.NET Framework (
, ..). Silver
light WPF.
WPF .NET -
Silverlight, ,
WPF .NET.
, .NET. -
WPF .NET Framework
(, Visual State Manager
), ( ). , WPF
.NET , Silverlight, ,
.
, : WPF Silver
light?, .NET ?.
,
.NET, . WPF.
,
Mac , ,
Silverlight. Silverlight
(
HTML).
.

. (
)
, ,
Windows Mac.
, - , ,
WPF, Silverlight, .
Silverlight , ,
WPF, #ifdef.
Silverlight WPF,
.
(), WPF Silverlight
. , Silverlight ,
Windows Presentation Foundation,
.
Silverlight WPF
. Microsoft
. Microsoft
,
,

42

1. WPF Silverlight?

( ),
(Visual Studio, Expression Blend ..)
, , ( .NET # VB XAML) .
WPF Silverlight. ,
, , , , ,
, WPF, Silverlight.

,
, , ,
.
( Windows) .
WPF
, Windows-
( ) ,
.
,
.
. , !

XAML






XAML
XAML2009
XAML
XAML

2
2.

XAML

XML .NET
, .
XAML ( XML), WPF 2006
, .
, - HTML. ,
, , XAML ,
.
WPF Silverlight XAML
( ).
Windows Workflow Foundation (WF) Windows Communication Foun
dation (WCF) XAML
, .
XAML ,
.
XAML , ,
-
. XAML ( XML)
, , ,
.
WPF Silverlight
,
, Expression Blend,
, .

XAML, ,
, API,
.

44

2. XAML

(,
) .
, ,
XAML :
XAML
.
XAML
, ,
.
XAML ,
Visual Studio, Expression Blend -
,
.
XAML ,
WPF.
XAML
, .
, - .
,
, , API ,
. WPF-
, , , XAML,

XAML
(
, ), :
.xaml Inter
net Explorer ( Windows Vista Windows XP
.NET 3.0 ).
Firefox, .
WPF,
, WPF 4.
-
, XAMLPAD2009,
, Kaxaml (http://kaxaml.com),
WPF4.
WPF- Visual Studio
Window Page ;
.

XAML . XAML
Visual Studio .

XAML

45

,
XAML- (, ,
, ..).

FAQ
XamlPad?
Windows SDK XamlPad,
( ) WPF- XAML
, .
, . (,
, Microsoft
!)
XAML, :
XAMLPAD2009 .
, , .
, , XAML2009
( ).
Kaxaml , (Robby In
gebretsen), WPF;
http://kaxaml.com.
XamlPadX , http://blogs.
msdn.com/llobo/archive/2008/08/25/xamlpadx-4-0.aspx.
(Lester Lobo), WPF.
XAML Cruncher ClickOnce-,
http://charlespetzold.com/wpf/XamlCruncher/ XamlCruncher.application.
(Charles Petzold),
.

XAML
XAML
,
. XAML XML
, ,
, ( ).
XAML API
.NET, HTML, SVG (Scalable Vector Gra
phics) -
. XAML XML
, ,
. XAML
WPF C#
.NET Framework. Microsoft

46

2. XAML

XAML, .
, WPF XAML, Silverlight XAML
XAML-.


XAML XAML
XAML XAML :
XAML Object Mapping Specification 2006 (MS-XAML): http://go.microsoft.com/
fwlink/?LinkId=130721
WPF XAML Vocabulary Specification 2006 (MS-WPFXV): http://go.microsoft.
com/fwlink/?LinkId=130722
Silverlight XAML Vocabulary Specification 2008 (MS-SLXV): http://go.micro
soft.com/fwlink/?LinkId=130707

XAML WPF ,
, WPF XAML
. XAML WPF,
.
XAML -
. , XAML WPF-
. , XAML,
.NET- (
). - XAML,
, WPF-,
.


XAML,
, XAML,
.
12 14.
.
FrameworkElementFactory,
.
x:Shared="False", WPF
.
.

XAML-.

47


XAML ,
, .NET ,
XML. ( ) XAML, WPF- Button, C#:
XAML:
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="OK"/>

C#:
System.Windows.Controls.Button b = new System.Windows.Controls.Button();
b.Content = "OK";

, XAML
Internet Explorer ,
(.2.1), C#
.

.2.1. WPF Button, XAML-

XML- XAML- (
) .NET
.
(
)
( ). ,
Content, Click.
XAML:
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="OK" Click="button_Click"/>

48

2. XAML

C#:
System.Windows.Controls.Button b = new System.Windows.Controls.Button();
b.Click += new System.Windows.RoutedEventHandler(button_Click);
b.Content = "OK";

, - button_Click
, XAML-
, .2.1. XAML
, XAML-,
. , XAML, C#, .




, XAML- (
Name,
).
XAML.


. , ,
.NET
,
.


XAML-
# XML http://schemas.microsoft.com/
winfx/2006/xaml/presentation .NET System.Windows.Cont
rols. WPF
WPF,
XmlnsDefinitionAttribute. ( , URL-
schemas.microsoft.com -,
, .)
XAML-
XML;
.
XML ( ) ,
,
. , XAML-
WPF x
( xmlns:x, xmlns):
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

49

XAML,
System.Windows.Markup; ,

XAML. , XML-,
,
. XAML
XAML .


.NET
WPF WPF
.NET XML, WPF (http://
schemas.microsoft.com/winfx/2006/xaml/presentation):
System.Win
dows
System.Win
dows.Automation
System.Win
dows.Controls
System.Win
dows.Controls.Primitives
System.Win
dows.Data
System.Win
dows.Documents
System.Win
dows.Forms.Integration
System.Win
dows.Ink
System.Win
dows.Input
System.Win
dows.Media
System.Win
dows.Media.Animation
System.Win
dows.Media.Effects
System.Win
dows.Media.Imaging
System.Win
dows.Media.Media3D
System.Win
dows.Media.TextFormatting
System.Win
dows.Navigation
System.Win
dows.Shapes
System.Win
dows.Shell
--, WPF
,
.

WPF XML (http://schemas.microsoft.com/


winfx/2006/xaml/presentation) , XAML
(http://schemas.microsoft.com/winfx/2006/xaml) ,
x, , ,
# using System;. XAML-
, :

50

2. XAML
<WpfNamespace:Button
xmlns:WpfNamespace="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="OK"/>

,
XML ( ) ,
.

XAML ,
, WPF
XML (http://schemas.microsoft.com/winfx/2006/xaml/presentation)
, XAML (http://schemas.microsoft.com/winfx/
2006/xaml) , x. , ,
XAMLPAD2009, .


WPF XML
XAML- WPF
WPF XML, ,
WPF, System.Windows , XML.
WPF3.0 http://schemas.microsoft.
com/winfx/2006/xaml/presentation, WPF3.5
XML http://schemas.microsoft.com/netfx/2007/xaml/presentation,
WPF. ( ,
WinFX , .NET 3.0:
WPF, WCF WF. ,
.) WPF4
XML, WPF: http://schemas.
microsoft.com/netfx/2009/xaml/presentation.
,
http://schemas.microsoft.com/winfx/2006/xaml/presen
tation, WPF. ( ,
XAML- WPF;
, WPF 3.0)
, Silverlight http://schemas.micro
soft.com/winfx/2006/xaml/presentation, Silver
light- XAML-, WPF. Silverlight
http://schemas.microsoft.
com/client/2007, WPF.

51

XML .
, . - ,
.
WPF
/ . , winfx/2006
3.0 ,
netfx/2007 3.5 .. WPF4
netfx/2009
/, - (
, TextOptions) !
XAML- Internet Explorer
PresentationHost.exe, , .NET
Framework , XML
. netfx/2009, 4.0,
3., .


,
WPF .
, .2.1,
, ! ,
,
:
System.Windows.Controls.Button b = new System.Windows.Controls.Button();
System.Windows.Shapes.Rectangle r = new System.Windows.Shapes.Rectangle();
r.Width = 40;
r.Height = 40;
r.Fill = System.Windows.Media.Brushes.Black;
b.Content = r; // Button

Content Button System.Object; ,


Rectangle, 4040.
.2.2.
, , XAML
? , Content
Rectangle, #?
, XAML (
) .
:
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button.Content>
<Rectangle Height="40" Width="40" Fill="Black"/>
</Button.Content>
</Button>

52

2. XAML

.2.2. Button

Content XML-, XML, #. Button.


Content .
.
.
( x:Uid
).

. Button
(Content Background).
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="OK" Background="White"/>

,
:
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button.Content>
OK
</Button.Content>
<Button.Background>
White
</Button.Background>
</Button>

, XAML-
.


#-, Button:
Content Background:

53

System.Windows.Controls.Button b = new System.Windows.Controls.Button();


b.Content = "OK";
b.Background = System.Windows.Media.Brushes.White;

! "White" XAML-
System.Windows.Media.Brushes.White (
System.Windows.Media.SolidColorBrush)? ,
, XAML-
, System.String System.Object.
XAML
, .
WPF
: Brush, Color, FontWeight, Point .. ,
TypeConverter (BrushConverter, ColorConverter ..)
.
XAML, .
Brush, XAML-
Background
:
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="OK">
<Button.Background>
<SolidColorBrush Color="White"/>
</Button.Background>
</Button>

, Color
"White". ,
:
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="OK">
<Button.Background>
<SolidColorBrush>
<SolidColorBrush.Color>
<Color A="255" R="255" G="255" B="255"/>
</SolidColorBrush.Color>
</SolidColorBrush>
</Button.Background>
</Button>

,
"255" Byte,
A, R, G B Color. , .
XAML- , ,
.

54

2. XAML



#, Background System.
Windows.Media.Brushes.White, , XAML-,
"White",
. ,
, :
System.Windows.Controls.Button b = new System.Windows.Controls.Button();
b.Content = "OK";
b.Background = (Brush)System.ComponentModel.TypeDescriptor.GetConverter(
typeof(Brush)).ConvertFromInvariantString("White");
#, "White"
, ,
XAML. ( Visual Studio XAML-
.)



- XAML
? ,
System.
ComponentModel.TypeConverterAttribute.
, Background Button XAML-
BrushConverter, Background
System.Windows.Media.Brush, :
[TypeConverter(typeof(BrushConverter)), ...]
public abstract class Brush : ...
{
...
}

, FontSize FontSizeConverter, (
Control) :
[TypeConverter(typeof(FontSizeConverter)), ...]
public double FontSize
{
get { ... }
set { ... }
}

,
(double)
FontSizeConverter . WPF double
LengthConverter.

55


, ,
XAML.
(
,
) ,
.
WPF .
, , XAML
.
. ,
, ,
. ,

, , BrushConverter
.
{},
XAML ,
( -, ).
Button
:

<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="{x:Null}"

Height="{x:Static SystemParameters.IconHeight}"
Content="{Binding Path=Height, RelativeSource={RelativeSource Self}}"/>


,
MarkupExtension.
Extension, XAML . Null
Extension ( x:Null) StaticExtension ( x:Static)
System.Windows.Markup,
x. Binding (
Extension) System.Windows.Data,
XML,
.
,
, . (
, SystemParameters.IconHeight)
.

56

2. XAML

( Path RelativeSource)

.
( ,
RelativeSource) ,
. .NET (
), , ,
XAML
. .
Button NullExtension
Background ( Background) null,
BrushConverter (, , )
. ,
null . StaticExtension
XAML , ,
. Height
Button
,
IconHeight System.Windows.SystemParameters. Binding
13 .
Content , Height.




, ,
. ,
, :
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="{}{ !}"/>

, , .
,
. :
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button.Content>
{ !}
</Button.Content>
</Button>

(. 13) , .

57


, .
Button :
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Button.Background>
<x:Null/>
</Button.Background>
<Button.Height>
<x:Static Member="SystemParameters.IconHeight"/>
</Button.Height>
<Button.Content>
<Binding Path="Height">
<Binding.RelativeSource>
<RelativeSource Mode="Self"/>
</Binding.RelativeSource>
</Binding>
</Button.Content>
</Button>

,
,
( ).
, StaticExtension Member,
, ,
, RelativeSource Mode
.



.
, # XAML- Button
NullExtension, StaticExtension Binding:
System.Windows.Controls.Button b = new System.Windows.Controls.Button();
// Background:
b.Background = null;
// Height:
b.Height = System.Windows.SystemParameters.IconHeight;
// Content:
System.Windows.Data.Binding binding = new System.Windows.Data.Binding();
binding.Path = new System.Windows.PropertyPath("Height");
binding.RelativeSource = System.Windows.Data.RelativeSource.Self;
b.SetBinding(System.Windows.Controls.Button.ContentProperty, binding);

, XAML,
,

58

2. XAML

( ProvideValue).
,
(,
, Member StaticExten
sion). ,
!


XAML-, XML-,
. ,
(
, XAML ).
:
, ,
.

Content
WPF (
), XML-.

XAML- .

Visual Basic ( ).
Content Button (
),
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="OK"/>

:
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
OK
</Button>

Button,
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button.Content>
<Rectangle Height="40" Width="40" Fill="Black"/>
</Button.Content>
</Button>

:
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Rectangle Height="40" Width="40" Fill="Black"/>
</Button>

59

, Content;
, ComboBox, ListBox TabControl ( System.
Windows.Controls) Items.


XAML ,
: .

, Sys
tem.Collections.IList, System.Collections.ArrayList
, WPF. XAML-
ListBox, Items ItemsCollec
tion, IList:
<ListBox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ListBox.Items>
<ListBoxItem Content="Item 1"/>
<ListBoxItem Content="Item 2"/>
</ListBox.Items>
</ListBox>

XAML- #:
System.Windows.Controls.ListBox listbox = new System.Windows.Controls.ListBox();
System.Windows.Controls.ListBoxItem item1 =
new System.Windows.Controls.ListBoxItem();
System.Windows.Controls.ListBoxItem item2 =
new System.Windows.Controls.ListBoxItem();
item1.Content = "Item 1";
item2.Content = "Item 2";
listbox.Items.Add(item1);
listbox.Items.Add(item2);

, Items ListBox, XAML-


:
<ListBox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ListBoxItem Content="Item 1"/>
<ListBoxItem Content="Item 2"/>
</ListBox>

, Items ListBox
.
null (, Items
ListBox, ),
XAML,
. WPF
, OtherList
Box:

60

2. XAML
<OtherListBox>
<OtherListBox.Items>
<ItemCollection>
<ListBoxItem Content="Item 1"/>
<ListBoxItem Content="Item 2"/>
</ItemCollection>
</OtherListBox.Items>
</OtherListBox>

System.Windows.ResourceDictionary WPF ,
12 .
System.Collections.IDictionary, , ,
/ , -
. XAML , IDictionary,
/. , XAML-
ResourceDictionary Color:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Color x:Key="1" A="255" R="255" G="255" B="255"/>
<Color x:Key="2" A="0" R="0" G="0" B="0"/>
</ResourceDictionary>

XAML ey (
XML),
Color . (
Color Key .) , XAML-
#:
System.Windows.ResourceDictionary d = new System.Windows.ResourceDictionary();
System.Windows.Media.Color color1 = new System.Windows.Media.Color();
System.Windows.Media.Color color2 = new System.Windows.Media.Color();
color1.A = 255; color1.R = 255; color1.G = 255; color1.B = 255;
color2.A = 0; color2.R = 0; color2.G = 0; color2.B = 0;
d.Add("1", color1);
d.Add("2", color2);


, XAML2009
WPF XAML IList IDictio
nary, XAML2009 (
XAML2009) .
IList IDictionary, ICollection<T> IDictionary<K,V>,
Add GetEnumerator.

61

, , XAML x:Key,
,
XAML2009 (.
XAML2009).
.


,
SolidColorBrush XAML:
<SolidColorBrush>White</SolidColorBrush>

:
<SolidColorBrush Color="White"/>

, Color .
,
, , "White" ( "white",
"#FFFFFF") SolidColorBrush.

XAML, : , XAML
- , ,
.NET. ,
, XAML ,
,
. , , System.Windows.Media.Brush
SolidColorBrush, GradientBrush
, XAML :
<Brush>White</Brush>

Brush , SolidColorBrush.
,
XAML , ,
XAML.


XAML
XAML .NET,
.NET ( COM-
COM), .
, .

62

2. XAML


. ,
, ,
XAML ( XAML2009).
WPF ,
XAML ( .NET ).
WPF XmlnsDefinitionAttribute,
.NET XML
XAML-. ,
XAML , , ?

, XML. ,
#, .NET mscorlib.dll:
System.Collections.Hashtable h = new System.Collections.Hashtable();
h.Add("key1", 7);
h.Add("key2", 23);

XAML:
<collections:Hashtable
xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<sys:Int32 x:Key="key1">7</sys:Int32>
<sys:Int32 x:Key="key2">23</sys:Int32>
</collections:Hashtable>

clr-namespace .NET
XAML.
, ,
XAML-. (
mscorlib), ,
System.Reflection.Assembly.Load (, ),
, /
.
,
.NET, .NET Framework:
- Hashtable
XAML x:key, Hashtable,
.NET Framework, IDictio
nary 1.0.
System.Int32 ,
, .
, , XAML,
System.ComponentModel.TypeConverter,
.NET Framework 1.0.
, Windows Forms (,
, Visual Studio ,
).

XAML

63


XAML
.
XAML
:
1. IList, IList.Add
.
2. , IDictionary, IDictionary.Add
,
x:Key, . (, XAML2009
IDictionary IList
, .)
3. , (
System.Windows.Markup.ContentPropertyAttribute)
, .
4. ,
, (
),
,
.
5. ,
.
1 2 ,
, 3 , Content,
4 , ,
.

XAML
WPF- .NET-
. WPF-
XAML
(. 13), (. ) ,
, XAML, .
WPF- XAML
.
XAML .

XAML
WPF XAML, .
System.Windows.Markup:
XamlReader XamlWriter. API . XamlReader
Load, Xaml

64

2. XAML

Writer Save. ,
, .NET- ,
XAML . .NET Fra
mework 4 XAML,
. ,
, XAML,
.

XamlReader
XamlReader.Load XAML-,
.NET ,
. , XAML- MyWindow.xaml
Window (
7 ),
Window
:
Window window = null;
using (FileStream fs =
new FileStream("MyWindow.xaml", FileMode.Open, FileAccess.Read))
{
// . , Window
window = (Window)XamlReader.Load(fs);
}

Load FileStream (
System.IO). Load ,
XAML-,
. FileStream using.
XamlReader Stream
( System.Xml.XmlReader),
XAML- .
,
,
. ,
Window StackPanel,
OK:
Window window = null;
using (FileStream fs =
new FileStream("MyWindow.xaml", FileMode.Open, FileAccess.Read))
{
// . , Window
window = (Window)XamlReader.Load(fs);
}
// OK, (
// !)
StackPanel panel = (StackPanel)window.Content;
Button okButton = (Button)panel.Children[4];

XAML

65

Button, , :
(, ,
XAML),
- , XAML,
.
,

, XAML
.
XAML Button,
"OK",
. ,
, ?
, XAML ,
.

XamlReader LoadAsync,
XAML- .
, ,
, XAML- .
, CancelAsync
LoadCompleted, .
LoadAsync .
, Dispatcher.BeginIn
voke (WPF 200 ).
,
XAML x:SynchronousMode="Async". LoadSync
XAML , .

XAML
XAML Name,
. OK, ,
, - Window, Name
:
<Button x:Name="okButton">OK</Button>

#
Window.FindName,
:
Window window = null;
using (FileStream fs =

66

2. XAML
new FileStream("MyWindow.xaml", FileMode.Open, FileAccess.Read))
{
// . , Window
window = (Window)XamlReader.Load(fs);
}
// OK,
Button okButton = (Button)window.FindName("okButton");

FindName Window. Fra


meworkElement FrameworkContentElement,
WPF.


x:Name
x:Name ,
,
( System.Windows.Markup.
RuntimeNamePropertyAttribute). , FrameworkElement Framework
ContentElement Name, Runtime
NameProperty("Name"). ,
Name, x:Name.
, . , Name .

WPF
Binding :
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Label Target="{Binding ElementName=box}" Content="Enter _text:"/>
<TextBox Name="box"/>
</StackPanel>

( TextBox Target Label Alt+T.) WPF4 , System.Windows.Markup.Reference, , .


:
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Label Target="{x:Reference box}" Content="Enter _text:"/>
<TextBox Name="box"/>
</StackPanel>

XAML

67

, System.Windows.Markup.Na
meReferenceConverter ( ), , :
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Label Target="box" Content="Enter _text:"/>
<TextBox Name="box"/>
</StackPanel>

XAML
XAML

.NET- ,
XAML. WPF-
XAML, MSBuild Visual Studio.
XAML : XAML-
,
,
XAML . # Visual Basic
XAML .
XAML-
, WPF, Visual Studio,
(Build Action) Page (). (7 ,
.)
, XAML-
, XAML. Class,
XAML. :
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyWindow">
...
</Window>


XAML- .NET-
XAML- .NET-
:
CodeDom MSBiuld.
, ( ) .

68

2. XAML

( )
:
namespace MyNamespace
{
partial class MyWindow : Window
{
public MyWindow()
{
// , XAML-!
InitializeComponent();
...
}
...
}
}

(code-behind file). XAML-


( ,
Click Button), .
partial ,
. .NET-
(, , ++/CLI J#), XAML Subclass :
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyWindow" x:Subclass="MyNamespace.MyWindow2">
...
</Window>

XAML- (
MyWindow2), ,
(MyWindow). ,
.
WPF- # Visual Basic Visual Studio
Add New Item ( ),
- WPF-, Visual Studio
XAML- x:Class
, ,
,
.
MSBuild ,
, ,
#
, .
:

XAML

69

<ItemGroup>
<Page Include="MyWindow.xaml"/>
</ItemGroup>
<ItemGroup>
<Compile Include="MyWindow.xaml.cs">
<DependentUpon>MyWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>


MyWindow.xaml, :
BAML- (MyWindow.baml),
.
#- (MyWindow.g.cs),
, .

x:Class XAML. XAML- .


, ,
, , .
Visual Studio XAML- x:Class
XAML

.

BAML
BAML Binary Application Markup Lan
guage ( ). XAML,
, .
XAML
, XAML BAML
. BAML MSIL;
,
, XAML- ( ).
, BAML XAML.
. WPF4
BAML- (.
XAML).

70

2. XAML


- CAML
WPF XAML
BAML MSIL. MSIL- CAML,
Compiled Application Markup Language (
). ,
(BAML) (CAML).
WPF
, . BAML
, :
, MSIL, ( ) .
, CAML BAML, .
, . ,
DLL-,
..


XAML -
( x:Class), ,
,
XAML- .
.g.cs ( .g.vb), g (generated).

, x:Class .
( internal)
XAML-, .
InitializeComponent,
BAML-,
, XAML-,
( XAML).
, ,
,
( BAML ),
BAML
. ,
, ,
, .
InitializeComponent .

XAML


InitializeComponent
!
, ,
XAML- ( BAML-
), , ,
null.


XAML
XAML
, ( ASP.NET).
Code XAML:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyWindow">
<Button Click="button_Click">OK</Button>
<x:Code><![CDATA[
void button_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
]]></x:Code>
</Window>

XAML- x:Code
, .g.cs-. ,
XAML- ; ,
.
<![CDATA[...]]> , '<' &lt;, &amp;,
CDATA XML, XML-. (,
]]>, CDATA!)
, XAML- . ,
, Visual Studio , IntelliSense
.

71

72

2. XAML

FAQ
BAML XAML?
, , BAML
XAML ,
.
,
XAML. , System.Windows.
Application.LoadComponent, BAML:
System.Uri uri = new System.Uri("/WpfApplication1;component/MyWindow.xaml",
System.UriKind.Relative);
Window window = (Window)Application.LoadComponent(uri);

, BAML, .xaml .
, XAML-
FileStream, LoadComponent
(URI)
. LoadComponent
BAML-, ,
URI ( , MSBuild,
XAML-).
Visual Studio InitializeComponent Applica
tion.LoadComponent BAML-, ,
. 12
URI.
, System.Windows.Mark
up.XamlWriter, XAML- (
, ). XamlWriter
Save;
XAML- :
string xaml = XamlWriter.Save(window);

, BAML- , ,
,
. (,
HTML-, JavaScript- CSS- .)
.NET Reflector BamlViewer
(. http://codeplex.com/reflectoraddins), BAML-,
, XAML-.

XAML2009
XAML ,
WPF, XAML WPF
WPF.

XAML2009

73

WPF. .NET Framework 4.0


System.Xaml,
XAML. WPF ( WCF WF) System.
Xaml, .
.NET Framework 4.0
XAML. XAML2009. (
, XAML2006.) Sys
tem.Xaml XAML2009, API (, Sys
tem.Windows.Markup.XamlReader System.Windows.Markup.XamlWriter
), XAML2006.
XAML2009, ,
,
XAML. , :
WPF-,
XAML API XAML2006,
WPF Visual Studio,
.
, WPF
XAML2009. (, Silverlight
XAML2009; XAML2006 !)
WPF4 XAML , ,
API XAML2009. , , XAMLPAD2009,
, Internet Explorer
XML netfx/2009.
XAML2009 ,
. ,
XAML .
, XAML2009
XAML.
, ,
.


XAML2006
x:TypeArguments,
.
x:TypeArguments ,
XAML2006
.
, ,
. XAML
. :

74

2. XAML

C#:
public class PhotoCollection : ObservableCollection<Photo> {}

XAML:
<custom:PhotoCollection>
<custom:Photo .../>
<custom:Photo .../>
</custom:PhotoCollection>

XAML2009 x:TypeArguments ,
, , ObservableCollection<Photo>
XAML:
<collections:ObservableCollection TypeArguments="custom:Photo">
<custom:Photo .../>
<custom:Photo .../>
</collections:ObservableCollection>

, collections
System.Collections.ObjectModel, ObservableCollection.


XAML2009
x:Key,
, . :
<collections:Dictionary x:TypeArguments="x:Int32, x:String">
<x:String x:Key="1">One</x:String>
<x:String x:Key="2">Two</x:String>
</collections:Dictionary>

, collections
System.Collections.Generic.



XamlObjectWriter XAML2009

. XamlObjectWriterSettings.PreferUnconvertedDictionaryKeys.
true, System.Xaml ,
IDictionary, , :
System.Xaml IDictionary.Add
,
.NET Framework, System.Xaml
, .

XAML2009

75


XAML2006 .NET, String
Int32, ,
System mscorlib; , :
<sys:Int32 xmlns:sys="clr-namespace:System;assembly=mscorlib">7</sys:Int32>

XAML2009 XAML 13
.NET. ,
x, : x:Byte, x:Boolean, x:Int16,
x:Int32, x:Int64, x:Single, x:Double, x:Decimal, x:Char, x:String, x:Object, x:Uri, x:Ti
meSpan. , :
<x:Int32 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">7</x:Int32>

XAML-, XAML,
:
<x:Int32>7</x:Int32>

XAML2009 x:Arguments,
.
, , System.Version,
. XAML2006
,
( , ,
, 0.0).
XAML2009 ,
:
<sys:Version x:Arguments="4.0.30319.1"/>

;
.
x:TypeArguments, x:Arguments

. , x:Arguments.
, System.Version,
, :
<sys:Version>
<x:Arguments>
<x:Int32>4</x:Int32>
<x:Int32>0</x:Int32>
<x:Int32>30319</x:Int32>
<x:Int32>1</x:Int32>
</x:Arguments>
</sys:Version>

76

2. XAML


x:FactoryMethod XAML2009
, . x:Fac
toryMethod ,
. , XAML-
Guid, Guid.
NewGuid:
<Label xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:Guid x:FactoryMethod="sys:Guid.NewGuid"/>
</Label>

x:FactoryMethod x:Arguments,
, .
, Marshal.GetExcep
tionForHR, HRESULT
.NET, CLR
:
<Label xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:interop=
"clr-namespace:System.Runtime.InteropServices;assembly=mscorlib">
<sys:Exception x:FactoryMethod="interop:Marshal.GetExceptionForHR">
<x:Arguments>
<x:Int32>0x80004001</x:Int32>
</x:Arguments>
</sys:Exception>
</Label>

.2.3 , XAMLPAD2009
Label StackPanel.


XAML2006
XAML-. XAML2009 ,

. , XAML2009
,
:
<Button Click="{custom:DelegateFinder Click}"/>

,
.

XAML

77

.2.3. ,


XAML
.
XAML2009 x:Members x:Property,

XAML. WPF.
XAML Windows Workflow Foundation,
:
<Activity x:Class="ActivityLibrary1.Activity1" ...>
<x:Members>
<x:Property Name="argument1" Type="InArgument(x:Int32)"/>
<x:Property Name="argument2" Type="OutArgument(x:String)"/>
</x:Members>
...
</Activity>

XAML
, XAML- Xaml
Reader.Load XamlWriter.Save System.Windows.Markup.
API WPF
WPF ,
XAML2006.

78

2. XAML

System.Xaml System.Xaml.
XamlReader System.Xaml.XamlWriter (
/), XAML.
System.Xaml ,
, .
XAML2009.

XamlReader XAML
(
), XamlWriter
.
:
( System.Xaml.XamlReader):
System.Xaml.XamlXmlReader XML- ( System.Xml.XmlReader, System.
IO.TextReader, System.IO.Stream ,
).
System.Xaml.XamlObjectReader .
System.Win
dows.Baml2006.Baml2006Reader BAML- ( WPF
2006).
System.Xaml.XamlBackgroundReader XamlReader,
,
, .
( System.Xaml.XamlWriter):
System.Xaml.XamlXmlWriter XML ( System.Xml.XmlWriter,
System.IO.TextWriter Stream).
System.Xaml.XamlObjectWriter .
XAML ,
.NET Framework,
System.IO System.Xml.
,
, XAML .
.2.4, ,
.NET Framework. XAML
XML,
, .
, .2.4 , ,

, .

XAML (

79

XAML

API). 40
(Autodesk 3ds Max Maya, AutoCAD DXF, NewTek LightWave ..), Adobe
Illustrator/Photoshop/Flash/Fireworks, SVG, HTML 5 Canvas, Visio, PowerPo
int, Windows Metafile (WMF), Enhanced Metafile (EMF), Visual
Basic 6!

XML

XAML

XML

BAML

.2.4. ,



XAML, WPF!

XAML. , ,
. XamlObjectReader
WPF, WPF XAML
- System.Windows.Markup.XamlWriter.
XAML WPF, .

80

2. XAML

FAQ
XAML-
XamlXmlReader, XmlReader? XAML
XML?
XamlXmlReader XmlReader,
.
XML,
XAML.
XAML, XAML
,
XML.
,
XAML. , XAML-
Button, Content
"":
<!-- : -->
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
OK
</Button>
<-- : -->
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button.Content>
OK
</Button.Content>
</Button>
<!-- : -->
<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Content="OK"/>

XmlReader -, XamlXmlReader
. ,
XAML (
XAML),
. , XamlXmlReader
, ,
Button
Content.
, ,
XAML, XamlXmlReader (
XAML),
, . ,
XamlXmlReader , Content
System.Object.

XAML

81



XAML ,
. XamlReader XamlWriter ,
,
,
. , reader
XAML, writer , :
//
while (reader.Read())
{
writer.WriteNode(reader);
}

,
. , XAMLPAD2009
XAML XML ( )
,
(, ). 2.1
,
XamlXmlReader, XamlObjectWriter.
XamlXmlReader XML.
, System.IO.StringReader
XamlXmlReader ( , StringReader
TextReader).
2.1. XAML-,
XML,
public static object ConvertXmlStringToObjectGraph(string xmlString)
{
// String -> TextReader -> XamlXmlReader
using (TextReader textReader = new StringReader(xmlString))
using (XamlXmlReader reader = new XamlXmlReader(textReader,
System.Windows.Markup.XamlReader.GetWpfSchemaContext()))
using (XamlObjectWriter writer = new XamlObjectWriter(reader.SchemaContext))
{
//
while (reader.Read())
{
writer.WriteNode(reader);
}
// XamlObjectWriter
//
return writer.Result;
}
}

82

2. XAML

XamlObjectWriter WPF-,
XAML WPF.
, XAML- .

XAML
XAML
XAML,
, - ,
.
XamlReader,
, NodeType,
:
StartObject
, XML-
, .
GetObject ,
, XAML ,
( ListBox,
).
EndObject (
StartObject GetObject). StartObject
GetObject EndObject, .
StartMember
: ( ), (
) XAML, x:Key.
, StartMember
StartObject GetObject. , XML
,
, , .
EndMember (
StartMember). StartMember
EndMember.
Value .
- ,
Value StartMember (
StartObject GetObject).
NamespaceDeclaration
XML (
). , Start
Object, .
, , ,
, ,
.

XAML

83

None -,

, .
.
XamlReader ,
: Type, Member, Value Namespace.

. , NodeType StartObject, Type
XamlType, null.
NodeType StartMember, Member Xaml
Member, null. NodeType Value,
Value null. NodeType NamespaceDeclaration,
Namespace.
, XAML .NET Framework 4.0 (
XamlObjectReader) IXamlLineInfo,
, . HasLineInfo
true, ,
LineNumber LinePosition .

FAQ
XamlType XamlMember,
XAML?
XAML
.NET.
XamlType System.Type (
UnderlyingType), XAML ,
, .

XamlType .NET.
XamlMember System.Reflection.MemberInfo (
UnderlyingMember, MemberInfo
). XAML ,
IsDirective PreferredXamlNamespace.

,
XAML, .2.1 , XamlXmlReader
XAML- 2.2. XamlNodeType
, .
2.2. XAML-
XamlXmlReader
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- -->
<Button Name="okButton" Click="okButton_Click">OK</Button>

84

2. XAML

<Button x:Name="cancelButton">Cancel</Button>
<ListBox>
<-- -->
<ListBoxItem Content="Item 1"/>
<ListBoxItem>Item 2</ListBoxItem>
<ListBoxItem>
<ListBoxItem.Content>
Item 3
</ListBoxItem.Content>
</ListBoxItem>
</ListBox>
</StackPanel>

2.1. XAML, XamlXmlReader


2.2
XamlNodeType

NamespaceDeclaration

Namespace=".../xaml/presentation",
Prefix=""

13

NamespaceDeclaration

Namespace=".../xaml", Prefix="x"

13

StartObject

Type=StackPanel

StartMember

Member= UIElementCol
lection

GetObject

null

StartMember

Member=_Items, XamlDirective
List<Object>

StartObject

Type=Button

StartMember

Member=Name String

11

Value

Value="okButton"

11

EndMember

null

11

StartMember

Member=Click RoutedEventHander 4
(IsEvent=true)

27

Value

Value="okButton_Click"

27

EndMember

null

27

StartMember

Member=Content Object

54

Value

Value="OK"

54

EndMember

null

54

EndObject

null

54

StartObject

Type=Button

StartMember

Member=Name, XamlDirective
String

11

85

XAML
XamlNodeType

Value

Value="cancelButton"

11

EndMember

null

11

StartMember

Member=Content Object

41

Value

Value="Cancel"

41

EndMember

null

41

EndObject

null

41

StartObject

Type=ListBox

StartMember

Member=Items ItemCollection

GetObject

null

StartMember

Member=_Items, XamlDirective
List<Object>

StartObject

Type=ListBoxItem

StartMember Member=Content Object

18

Value

Value="Item 1"

18

EndMember

null

18

EndObject

null

StartObject

Type=ListBoxItem

StartMember Member=Content Object

26

Value

Value="Item 2"

26

EndMember

null

26

EndObject

null

26

StartObject

Type=ListBoxItem

10

StartMember Member=Content Object

11

Value

Value="Item 3"

13

EndMember

null

13

EndObject

null

14

EndMember

null

15

EndObject

null

15

EndMember

null

15

EndObject

null

15

EndMember

null

16

EndObject

null

16

EndMember

null

16

EndObject

null

16

86

2. XAML

, ListBoxItem .2.1
, Button,
Name Button XAML
x:Name. ( XamlMember XamlDirective,
IsDirective true.)
, GetObject, EndMember EndObject
;
. -
XAML
, / .



(http://schemas.openxmlformats.org/
markup-compatibility/2006, mc)
Ignorable, XAML
/ ,
.NET. (
ProcessContent, Ignorable
.)
Expression Blend
XAML- ,
. . :
<StackPanel xmlns="http://schemas.microsoft.com/client/2007"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="100" d:DesignHeight="100">
...
</StackPanel>

mc:Ignorable ,
, mc:ProcessContent ,
.
XamlXmlReader ,
, .
, .

.


XAMLPAD2009 XAML ,
. XAML-,
WPF
XAML. , .

XAML

87

, ,

, XamlObjectWriter , ,
: Failed to create a 'Click' from the text 'button_Click'.
, XamlObjectWriter RootObjectInstance,

,
XAML . ,
x:Class, XAML-
.
Window Page. 7
, , Window
, XAMLPAD2009

.
(, , Window,
), XAML
.
2.3 ,
XAML-
.
2.3. XAML-

public static object ConvertXmlStringToMorphedObjectGraph(string xmlString)
{
// String -> TextReader -> XamlXmlReader
using (TextReader textReader = new StringReader(xmlString))
using (XamlXmlReader reader = new XamlXmlReader(textReader,
System.Windows.Markup.XamlReader.GetWpfSchemaContext()))
using (XamlObjectWriter writer = new XamlObjectWriter(reader.SchemaContext))
{
//
while (reader.Read())
{
// x:Class
if (reader.NodeType == XamlNodeType.StartMember &&
reader.Member.IsEvent || reader.Member == XamlLanguage.Class)
{
reader.Skip();
}
if (reader.NodeType == XamlNodeType.StartObject &&
reader.Type.UnderlyingType == typeof(Window))
{
// Window Page
writer.WriteStartObject(new XamlType(typeof(Page),
reader.SchemaContext));
}

88

2. XAML
else
{
//
writer.WriteNode(reader);
}

}
// XamlObjectWriter
//
return writer.Result;
}
}

2.3 - (IsEvent = true) x:Class


Skip XamlReader. ( x:Class
System.Xaml.XamlLanguage,
XamlDirective XamlType
, ; .)
StartObject StartMember, Skip
, EndObject/
EndMember ( /, ).
, Skip
Read: .
Window Page StartObject.
, EndObject ,
. EndObject Window
EndObject Page. Window
Page ,
Window . ,
, Page
Window, .
2.1 2.3 Xaml
ObjectWriter.Result . ,
EndObject XamlObjectWriter.Result
.
EndObject , Re
sult .

XML
WPF- XAML- XML
. XamlObjectReader
WPF-, 2.4 , XML
, XamlObjectReader XamlObject
Writer. XAML,
XML-,
.

XAML

89

2.4. XAML, XML


public static string RewriteXaml(string xmlString)
{
// String -> TextReader -> XamlXmlReader
using (TextReader textReader = new StringReader(xmlString))
using (XamlXmlReader reader = new XamlXmlReader(textReader))
// TextWriter -> XmlWriter -> XamlXmlWriter
using (StringWriter textWriter = new StringWriter())
using (XmlWriter xmlWriter = XmlWriter.Create(textWriter,
new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }))
using (XamlXmlWriter writer = new XamlXmlWriter(xmlWriter,
reader.SchemaContext))
{
//
while (reader.Read())
{
writer.WriteNode(reader);
}
return textWriter.ToString();
}
}


. XamlXmlReader ,
, XamlXmlWriter System.IO.StringWriter. (Xml
Writer StringBuilder.)
XmlWriter (
), XML-
(<?xml version="1.0" encoding="utf-16"?>).
,
XamlXmlWriter StringWriter (
TextWriter), XmlWriter.
// TextWriter -> XamlXmlWriter
using (StringWriter textWriter = new StringWriter())
using (XamlXmlWriter writer = new XamlXmlWriter(textWriter,
reader.SchemaContext))
{
...
}

XamlServices
,
XAML
, System.Xaml.Xaml
Services, :
Load ,
, Stream, TextReader, XmlReader XamlReader.

90

2. XAML

,
XamlReader.Load. Load
XamlXmlReader XamlObjectWriter, 2.1.
Parse Load, Parse ,
XAML- .
StringReader, XmlReader XamlXmlReader,
Load. , Parse
ConvertXmlStringToObjectGraph,
2.1.
Save ,
, , Stream, TextWri
ter, XmlWriter XamlWriter
. Save XamlObjectReader
XamlXmlWriter ( XamlWriter).
Indent OmitXmlDeclaration XamlWriter
true, 2.4.
Transform ,
, .
XamlServices.Transform ,
.
,
(IXamlLineInfo
IXamlLineInfoConsumer ). , Transform
:
public static void Transform(XamlReader reader, XamlWriter writer)
{
IXamlLineInfo producer = reader as IXamlLineInfo;
IXamlLineInfoConsumer consumer = writer as IXamlLineInfoConsumer;
bool transferLineInfo = (producer != null && producer.HasLineInfo &&
consumer != null && consumer.ShouldProvideLineInfo);
//
while (reader.Read())
{
//
if (transferLineInfo && producer.LineNumber > 0)
consumer.SetLineInfo(producer.LineNumber, producer.LinePosition);
writer.WriteNode(reader);
}
}

, 2.1
( ), XamlServices.Transform,
2.5. , ConvertXmlStringToObjectGraph
, XamlServices.Parse.

XAML

2.5. 2.1
public static object ConvertXmlStringToObjectGraph(string xmlString)
{
// String -> TextReader -> XamlXmlReader
using (TextReader textReader = new StringReader(xmlString))
using (XamlXmlReader reader = new XamlXmlReader(textReader,
System.Windows.Markup.XamlReader.GetWpfSchemaContext()))
using (XamlObjectWriter writer = new XamlObjectWriter(reader.SchemaContext))
{
//
XamlServices.Transform(reader, writer);

// XamlObjectWriter
//
return writer.Result;
}
}


XamlServices WPF XAML!
, , XamlServices.Parse XamlServices.Save
XAML 2.4
, :
public static string RewriteXaml(string xmlString)
{
return XamlServices.Save(XamlServices.Parse(xmlString));
}

,
XamlXmlReader, XamlObjectWriter (
XamlServices.Parse),
XamlObjectReader
XmlWriter XamlXmlWriter.
.
XAML,
x:Class.
, , XamlObject
Writer WPF-.
XamlReader XamlWriter:
return System.Windows.Markup.XamlWriter.Save(
System.Windows.Markup.XamlReader.Parse(xmlString));

, :
using (StringWriter textWriter = new StringWriter())
using (XmlWriter xmlWriter = XmlWriter.Create(textWriter,

91

92

2. XAML

new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }))


{
System.Windows.Markup.XamlWriter.Save(
System.Windows.Markup.XamlReader.Parse(xmlString), xmlWriter);
return textWriter.ToString();
}

,
XAML- .

Microsoft XAML Toolkit ( http://code.msdn.


microsoft.com/XAML),
System.Xaml, ,
XAML FxCop XAML.
XAML DOM API, LINQ,
XAML-
, .
: SilverlightSchemaContext Silver
light XAML UISchemaContext, WPF
XAML Silverlight XAML.

XAML
XAML (http://schemas.microsoft.com/winfx/2006/xaml)
,
XAML.
,
, .
(Key, Name, Class, Subclass Code), .2.2 .
x,
XAML .


, W3C
XAML
, XML
World Wide Web Consortium (W3C): xml:space
xml:lang .
xml XML http://www.
w3.org/XML/1998/namespace.

93

XAML

2.2. XAML
x

x:AsyncRecords

2006+



XAML

X:Arguments

2009

(
,
),

.
x:FactoryMethod
()

X:Boolean

2009

System.
Boolean

X:Byte

2009

System.
Byte

x:Char

2009

System.
Char

x:Class

2006+

x:ClassAttributes 2009
,
x:Class


,
.


.NET
WPF;
,
Windows Workflow Foun
dation

x:ClassModifier

2006+
,
x:Class

,
x:Class (
).


(
public internal #)

x:Code

2006+
XAML,
x:Class

,
,
x:Class.

x:ConnectionId

2006+

x:Decimal

2009

System.Decimal

x:Double

2009

System.Double

94

2. XAML

2.2 ()

x:FactoryMethod

2009

x:FieldModifier

2006+
,
x:Name (
)

,

( internal).
x:ClassModifier,


(,
public, private, #)

x:Int16

2009

System.Int16

x:Int32

2009

System.Int32

x:Int64

2009

System.Int64

x:Key

, 2006+

IDictionary

x:Members

WPF 2009
XAML


,
x:Class

x:Name

2006+
,

x:Class

,
,

x:Object

System.Object

x:Property

WPF 2009
XAML


x:Members

x:Shared

2006+
ResourceDictionary,


XAML


false

(.
12)

x:Single

2009

System.Single

x:String

2009

System.String

x:Subclass

2006+
,
x:Class

2009

,
x:Class,
,
XAML.

95

XAML


.NET (
,
)

x:SynchronousMode 2006+

,
XAML

x:TimeSpan

2009

System.TimeSpan

x:TypeArguments

XAML2009
,
XAML2006
,

x:Class

2006+


( List<T>),

(, List<Int32>
List<String>).

.
,

,

XML

x:Uid

2006+


(.
12)

x:Uri

System.Uri

x:XData

, 2006+

IXml
Serializable

2009


XML,

XAML (. 13)

.2.3 XAML,
,
( .NET System.Windows.
Markup). Extension ,
.
2.3. XAML
, x

x:Array

.NET. x:Array
. x:Type,

x:Null

null

96

2. XAML

2.3 ()

x:Reference

.
,

x:Static

, ,
, .
XAML ,
. Member
XML,

x:Type

System.Type , typeof
#. TypeName
XML,

, XAML WPF,

XAML # . ,
,
.
, ,
! ( , ,
Parse, ,
.)
, ,
XAML (, null
), ,
.
XAML ,
.
WPF , , ,
API WPF ,
XAML. , WPF
(
, ), WPF-
, , , Win
dows Forms. XAML ,
,
WPF ,
XAML (, ),
(, ,
).

97

,
WPF , XAML, ,
XML .

.

1: XML ,

. XML-,
. , IntelliSense ,

! XML

(, XAML
),
.
, WPF
, 3D- .. XAML
. XAML
-
,
,
. , XAML API
WPF ,
.
HTML .

2: , XML,

XML ,
. WPF-
,
?
WPF XML BAML,

. BAML ,
XAML, . ,
XML
, , XML .

3.

WPF

I
, WPF,
.NET . -
WPF ,
. ,

WPF.

(, ),
(, ).

About
().


, WPF,
,
. WPF
, , . .3.1
12 .
Object , .NET,
,
WPF.
DispatcherObject , ,
, .
WPF DispatcherObject , ,
. Dispatcher

99

WPF
Win32, 7.
DependencyObject , ,
;
.
Freezable ,
, ,
.
, , Dis
patcherObject. ,
, .
Freezable : ,
, .
Visual ,
. 15
.
UIElement
, ,
. 5
6 : , ,
.
Visual3D ,
. 16 .
UIElement3D
, .
16.
Object
DispatcherObject
DependencyObject
Freezable

Visual

Visual3D

UIElement

UIElement3D

FrameworkElement

ContentElement
FrameworkContentElement

Control
2D

3D

.3.1. , WPF

Documents

100

3. WPF

ContentElement , UIElement,

,
.
ContentElement , ,
Visual. Content
Element Visual (
, ).
FrameworkElement , ,
, ,
Windows,
.
FrameworkContentElement FrameworkElement .
11 ,
.
Control
, Button, ListBox StatusBar. Control
FrameworkElement , Foreground, Back
ground FontSize, .
WPF III.

, UIElement FrameworkElement, Content
Element FrameworkContentElement. UIElement FrameworkElement
ContentElement FrameworkContentElement ,
WPF UIElement ContentElement.


XAML
. WPF
,
.
3.1
About (),
Window. Window StackPanel (. 5),

StackPanel, Button.
3.1. About XAML
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="About WPF 4 Unleashed" SizeToContent="WidthAndHeight"
Background="OrangeRed">
<StackPanel>
<Label FontWeight="Bold" FontSize="20" Foreground="White">
WPF 4 Unleashed
</Label>

101


<Label> 2010 SAMS Publishing</Label>
<Label>Installed Chapters:</Label>
<ListBox>
<ListBoxItem>Chapter 1</ListBoxItem>
<ListBoxItem>Chapter 2</ListBoxItem>
</ListBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button MinWidth="75" Margin="10">Help</Button>
<Button MinWidth="75" Margin="10">OK</Button>
</StackPanel>
<StatusBar>You have successfully registered this product.</StatusBar>
</StackPanel>
</Window>

.3.2 , (
, 3.1 XAMLPAD2009,
), .3.3 .

.3.2. , 3.1

Window

StackPanel

Label

Label

Label

String

String

String

ListBox

StackPanel

ListBoxItem

ListBoxItem

Button

Button

String

String

String

String

.3.3. , 3.1

StatusBar

String

102

3. WPF

, WPF-,
XAML. 3.1
, .
,
? , WPF (,
, ..) .
,
,
, .
, 6.
WPF ,
. ,
,
.
, ,
. ,
,
. , ListBox ,

WPF-: Border, ScrollBar .
,
, System.Windows.Media.Visual System.Win
dows.Media.Visual3D. ( ,
3.1) ,
.

XAML, XamlPadX,
,
( ) , XAML-.

. 3.4 ,
3.1 Windows 7 Aero.
,
, ScrollBar
ListBox Border Label. , Button, La
bel ListBoxItem
Button Border ButtonChrome. (
,
, .
, Button Margin
10, Label 0.)

Border

ContentPresenter

TextBlock

Border

ContentPresenter

TextBlock

TextBlock

TextBlock

ScrollBar

ContentPresenter

ContentPresenter

Grid
ScrollBar

ButtonChrome

ButtonChrome

ListBoxItem
Border
ContentPresenter
TextBlock

ListBoxItem
Border
ContentPresenter
TextBlock

VirtualizingStackPanel

AdornerLayer

ScrollContentPresenter

Border
ScrollViewer

StackPanel
Button

ListBox

AdornerLayer

Button

ItemsPresenter

Rectangle

TextBlock

ContentPresenter

Border

Label

AdornerLayer

.3.4. 3.1;

Label

Label

StackPanel

ContentPresenter

AdornerDecorator

Border

Window

TextBlock

ContentPresenter

Border

StatusBarItem

DockPanel

ItemsPresenter

Border

StatusBar

103

104

3. WPF

WPF-,
. ,
WPF,
,
(. 14 , ,
) (. 15).
, ,
Button,
WPF . -
, , 14,
- .

,
( , , ),
,
Windows!


System.Windows.LogicalTreeHelper System.Windows.Media.
VisualTreeHelper. 3.2 3.1,

About
. ( ,
3.1 x:Class="AboutDialog" xmlns:x.)
3.2.
using
using
using
using

System;
System.Diagnostics;
System.Windows;
System.Windows.Media;

public partial class AboutDialog : Window


{
public AboutDialog()
{
InitializeComponent();
PrintLogicalTree(0, this);
}
protected override void OnContentRendered(EventArgs e)
{
base.OnContentRendered(e);
PrintVisualTree(0, this);
}

105

void PrintLogicalTree(int depth, object obj)


{
// ,
//
Debug.WriteLine(new string(' ', depth) + obj);
//
// DependencyObject (, )
if (!(obj is DependencyObject)) return;
//
//
foreach (object child in LogicalTreeHelper.GetChildren(
obj as DependencyObject))
PrintLogicalTree(depth + 1, child);
}
void PrintVisualTree(int depth, DependencyObject obj)
{
// ,
//
Debug.WriteLine(new string(' ', depth) + obj);
//
//
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
PrintVisualTree(depth + 1, VisualTreeHelper.GetChild(obj, i));
}
}

depth, 0,
Window obj,
, .3.2 3.3.
,
Window. Print
VisualTree OnContentRendered,
.

, .3.4,
,
, .
, (?)
. , , Window
Border, AdornerDecorator, AdornerLayer, ContentPresenter
. StackPanel . 3.4
ContentPresenter, Visual
TreeHelper .

106

3. WPF


. , Visual
(VisualParent, VisualChildrenCount GetVisualChild)
. FrameworkElement,
, Button Label,
FrameworkContentElement Parent,
, LogicalChildren,
.
,
, Children.
, Button Label, Content
.

Visual Studio 2010


, Visual, .


WPF ;
, ,
, . ,
, ,
.NET, , ,
. , ,
, , , .
,
.
, , ,
, .. ,

.

.
WPF
. , Button 111 (
98 Control )!
XAML- (
) . ,
,
.

107


, ,
,
.NET :




.
WPF , .
,
. WPF, ,
!


.NET,
, WPF.
WPF API; .NET-
( XAML)
.
3.3 , Button
IsDefault.
3.3.
public class Button : ButtonBase
{
//
public static readonly DependencyProperty IsDefaultProperty;
static Button()
{
//
Button.IsDefaultProperty = DependencyProperty.Register("IsDefault",
typeof(bool), typeof(Button),
new FrameworkPropertyMetadata(false,
new PropertyChangedCallback(OnIsDefaultChanged)));
...
}
// .NET ()
public bool IsDefault
{
get { return (bool)GetValue(Button.IsDefaultProperty); }
set { SetValue(Button.IsDefaultProperty, value); }
}

108

3. WPF

// , ()
private static void OnIsDefaultChanged(
DependencyObject o, DependencyPropertyChangedEventArgs e) { ... }
...
}

IsDefaultProperty System.Windows.DependencyProperty
.
DependencyProperty , ,
Property.
, ,
XAML .
DependencyPro
perty.Register (IsDefault), (bool)
, (Button). (
Register) ,
, WPF ,
,
. Button Register
;
false ,
.
IsDefault.
GetValue SetValue, System.Windows.DependencyObject,
,
. GetValue , Set
Value, , SetValue ,
, . .NET IsDefault
( )
; Button
GetValue SetValue, .
.NET
, ,
XAML. WPF
GetValue SetValue.
, ,
.NET .

Visual Studio propdp,


. , !

109

.NET
XAML!
XAML , , WPF GetValue Set
Value!
XAML
- GetValue/SetValue. ,
. WPF
, , .

3.3
.
GetValue SetValue
, IsDefaultProperty (
),
, ,
.NET. WPF
( .NET),
-
. 111 ,
104 ..! 89 111
Button 82 104 Label
.
.
,
-
,
. ,
( Background
Button), FrameworkPropertyMetadataOptions.
AffectsRender DependencyProperty.
Register. ,
, .


WPF
.
, ,
.
,

110

3. WPF


.
, , ,
About 3.1
.
MouseEnter MouseLeave:
<Button MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave"
MinWidth="75" Margin="10">Help</Button>
<Button MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave"
MinWidth="75" Margin="10">OK</Button>

C#
:
// ,
void Button_MouseEnter(object sender, MouseEventArgs e)
{
Button b = sender as Button;
if (b != null) b.Foreground = Brushes.Blue;
}
// ,
void Button_MouseLeave(object sender, MouseEventArgs e)
{
Button b = sender as Button;
if (b != null) b.Foreground = Brushes.Black;
}


XAML. Trigger:
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Blue"/>
</Trigger>

IsMouseOver Button,
true Mouse
Enter false MouseLeave.
, , IsMouseOver
false, . WPF !
,
. , -
, Button.
Style,
14. ,
,
XML-:

111

<Button MinWidth="75" Margin="10">


<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Blue"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
OK
</Button>

, WPF.
,
.NET ( );
14.
,
(. 6).
,
17 .

Triggers!
Triggers FrameworkElement TriggerBase (
)
, Button. , ,
, . ( ) .


(
) -
,
. 3.4 ,
3.1, Window
FontSize FontStyle. . 3.5
. (, SizeToContent
Window !)

112

3. WPF

.3.5. About, Window


FontSize FontStyle

3.4. About, Window



<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="About WPF 4 Unleashed" SizeToContent="WidthAndHeight"
FontSize="30" FontStyle="Italic"
Background="OrangeRed">
<StackPanel>
<Label FontWeight="Bold" FontSize="20" Foreground="White">
WPF 4 Unleashed
</Label>
<Label> 2010 SAMS Publishing</Label>
<Label>Installed Chapters:</Label>
<ListBox>
<ListBoxItem>Chapter 1</ListBoxItem>
<ListBoxItem>Chapter 2</ListBoxItem>
</ListBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button MinWidth="75" Margin="10">Help</Button>
<Button MinWidth="75" Margin="10">OK</Button>
</StackPanel>
<StatusBar>You have successfully registered this product.</StatusBar>
</StackPanel>
</Window>


. Button List
BoxItem, .
FontSize Label ,
FontSize 20, 30. ,

113

FontStyle Label, ListBoxItem Button,


.
, StatusBar
, StatusBar , , ,
.
.
.
(
FrameworkPropertyMetadataOptions.Inherits
DependencyProperty.Register.)

(. ).
.
, StatusBar, Menu ToolTip,

.
.
WPF-,

. , 3.4 Button
StatusBar, FontSize FontStyle
12 Normal , ,
, StatusBar.



, . , ,
XML (
XAML),
. ,
, ( Content Children) , Freezable.
,
, XAML
, .


WPF ,
.
,

114

3. WPF

,
. , , .
.3.6 , WPF
.

.

( )

.3.6.

1:

. ,
,
:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
,
(9). (1)
DependencyObject.SetValue,
XAML (
,
Button.IsDefault). (10)
, ;
, .
, 14.
,
FontSize Font
Style StatusBar 3.4. StatusBar

(8). ,
(9),

115

,
StatusBar.

,
, Depen
dencyPropertyHelper.GetValueSource. ValueSource, : BaseValueSource, ( 1) IsExpression, IsAnimated
IsCoerced, 24.
StatusBar 3.1 3.4,
FontSize FontStyle, BaseValueSource DefaultStyle, , . (, , .
DefaultStyleTrigger.)
! WPF
, ,
. ,
WPF-.



, , ,
MouseEnter MouseLeave.
, MouseLeave
, Button .
Foreground (
), , .
WPF
,
. , DependencyObject
: ClearValue. C#
Button b:
b.ClearValue(Button.ForegroundProperty);

(Button.ForegroundProperty DependencyProperty.)
ClearValue WPF ,
.
, IsMouseOver, , . ,
, .

116

3. WPF

2:
, 1, (
, System.Windows.Expression), WPF

.
( 13).
3:
,
( ,
2) . , ( 17)

! WPF .
4:
, WPF
CoerceValueCallback,
.
, .
, WPF ProgressBar
Value
Minimum Maximum, Minimum,
Minimum, Maximum Maximum.
, CoerceValue
WPF .
5:
ValidateValueCallback,
.
true, , false .
false, WPF ,
.

WPF4 DependencyObject SetCurrentValue.


, . ( - .)
,
. , RadioButton IsChe
cked RadioButton ,
. WPF , , . , ,
. WPF4 RadioButton SetCurrentValue.

117


,
.
, WPF.
, About FontSize Font
Style Window ( 3.4),
StackPanel,
Button. StackPanel
, StackPanel ,
!
FontSize FontStyle, TextElement. 3.5
XAML,
.
(.3.7).

.3.7. About, FontSize FontStyle


StackPanel

3.5. About,
StackPanel
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="About WPF 4 Unleashed" SizeToContent="WidthAndHeight"
Background="OrangeRed">
<StackPanel>
<Label FontWeight="Bold" FontSize="20" Foreground="White">
WPF 4 Unleashed
</Label>
<Label> 2010 SAMS Publishing</Label>
<Label>Installed Chapters:</Label>
<ListBox>
<ListBoxItem>Chapter 1</ListBoxItem>
<ListBoxItem>Chapter 2</ListBoxItem>
</ListBox>

118

3. WPF

<StackPanel TextElement.FontSize="30" TextElement.FontStyle="Italic"


Orientation="Horizontal" HorizontalAlignment="Center">
<Button MinWidth="75" Margin="10">Help</Button>
<Button MinWidth="75" Margin="10">OK</Button>
</StackPanel>
<StatusBar>You have successfully registered this product.</StatusBar>
</StackPanel>
</Window>

StackPanel TextElement.FontSize TextElement.


FontStyle ( FontSize FontStyle), StackPanel
. XAML
, , TextElement (
)
SetFontSize SetFontStyle,
. 3.5 StackPanel
C#:
StackPanel panel = new StackPanel();
TextElement.SetFontSize(panel, 30);
TextElement.SetFontStyle(panel, FontStyles.Italic);
panel.Orientation = Orientation.Horizontal;
panel.HorizontalAlignment = HorizontalAlignment.Center;
Button helpButton = new Button();
helpButton.MinWidth = 75;
helpButton.Margin = new Thickness(10);
helpButton.Content = "Help";
Button okButton = new Button();
okButton.MinWidth = 75;
okButton.Margin = new Thickness(10);
okButton.Content = "OK";
panel.Children.Add(helpButton);
panel.Children.Add(okButton);

, , FontStyles.Italic, Orientation.
Horizontal HorizontalAlignment.Center, XAML-
Italic, Horizontal Center. Enum
Converter .NET Framework,
.
XAML- 3.5 FontSize
FontStyle StackPanel , C# ,
, ,
.
,
.NET !
SetFontSize
DependencyObject.SetValue,
, ,
DependencyObject:

119

public static void SetFontSize(DependencyObject element, double value)


{
element.SetValue(TextElement.FontSizeProperty, value);
}

GetXXX (
XXX ), Dependency
Object.GetValue:
public static double GetFontSize(DependencyObject element)
{
return (double)element.GetValue(TextElement.FontSizeProperty);
}

,
GetXXX SetXXX , GetValue
SetValue .



FontSize FontStyle
3.5 , Button Control,
FontSize FontStyle, , ,
TextElement ( TextBlock,
TextElement)!
, TextElement.FontSizeProperty Control.FontSizeProperty ( TextElement.FontStyleProperty
Control.FontStyleProperty)?
. TextElement
:
TextElement.FontSizeProperty = DependencyProperty.RegisterAttached(
"FontSize", typeof(double), typeof(TextElement),new FrameworkPropertyMetadata(
SystemFonts.MessageFontSize, FrameworkPropertyMetadataOptions.Inherits |
FrameworkPropertyMetadataOptions.AffectsRender |
FrameworkPropertyMetadataOptions.AffectsMeasure),
new ValidateValueCallback(TextElement.IsValidFontSize));


IsDefault Button , RegisterAttached ,
.
, Control FontSize
! AddOwner TextElement ,
:

120

3. WPF

Control.FontSizeProperty = TextElement.FontSizeProperty.AddOwner(
typeof(Control), new FrameworkPropertyMetadata(SystemFonts.MessageFontSize,
FrameworkPropertyMetadataOptions.Inherits));

FontSize, FontStyle , ,
, TextElement!
, , ( GetXXX SetXXX), ,
, .



, Windows Forms,
WPF Tag ( System.Object), , . , DependencyObject. , ( WPF )!
:
XAML- SetXXX,
DependencyObject.
SetValue . ,
. ,
Button IsTextSearchEnabled,
ItemsControl, :
// Button
// true
okButton.SetValue(ItemsControl.IsTextSearchEnabledProperty, true);

Button , ,
.
. , Tag FrameworkElement , GeometryModel3D (
, 16,
Tag):
GeometryModel3D model = new GeometryModel3D();
model.SetValue(FrameworkElement.TagProperty, "my custom data");

WPF .

121

About
,

. (
WPF.)
Panel ,
.
Panel
, ,
.
,
Panel
. 5 21
.

,
.NET Framework WPF. WPF
.NET API, Windows
Forms, .
-
,
,
.
,
, , :
,
( )! ,
.
,

.

II
II.

WPF-

4 ,
5
6 : , ,

7
8 Windows 7

4.

WPF-
.
( )
, .
WPF .
- .
.
,
, ,
; ,
, .
, ,
, System.Windows.Cont
rols.Panel. , ( ,
), System.Windows.UIElement.
WPF ,
:
4 ,
5
21

, .
,
.4.1 ,
. , ,

126

4. ,

, , .
(
), , .

VerticalAlignment

HorizontalAlignment

Margin
Padding

Height

FlowDirection

Width
LayoutTransform
RenderTransform

.4.1. , ,


WPF ,
-.
, .


, (,
),
. WPF
, ,
, . (
Window, SizeToContent,
.)
.

Height Width
, FrameworkElement, Height (
) Width () ( double), MinHeight, MaxHeight, MinWidth Max
Width,
.
, XAML.

127

,
MinHeight MinWidth,
,
.
MaxHeight MaxWidth ( ,
).
Height Width,
, Min Max.
MinHeight MinWidth 0, MaxHeight MaxWidth Double.Positive
Infinity ( XAML "Infinity").

!
,
ContentControl, Button Label,
,
. ,
. ,
.


"Auto"
Height Width FrameworkElement
Double.NaN (NaN not a number ), ,
.
XAML- "NaN" ( )
"Auto" ( ),
LengthConverter, .
, ,
Double.IsNaN.

, FrameworkElement
, :
DesiredSize ( UIElement)
RenderSize ( UIElement)
ActualHeight ActualWidth
,
,
, . Desi
redSize

128

4. ,

( Width, Height, MinXXX MaxXXX) ,


. .
RenderSize
, ActualHeight ActualWidth ,
RenderSize.Height RenderSize.Width. :
,
,
.
, .
, , ,
. ,
Height Width , Double.NaN,
.
21 .

ActualHeight
ActualWidth ( RenderSize)!
RenderSize (, ActualHeight Actu
alWidth) . ,
, .
LayoutUpdated,
UIElement.
UIElement UpdateLayout,
,
. UpdateLayout
, ,
,
.

Margin Padding
Margin Padding .
Margin , FrameworkElement,
Padding ,
Control ( Border). , Margin
, Padding
.
System.Windows.Thickness; ,
, double.
4.1, Label
Padding Margin.
Border, . .4.2

129

, ,
Canvas ( ,
). , Margin ( Padding)
.
(Paddings):

(Margins):

.4.2. Margin Padding

4.1. Margin Padding ,



<!-- : -->
<!-- 1 : : -->
<Label Padding="0" Background="Orange">0</Label>
<Label Padding="10" Background="Orange">10</Label>
<!-- 2 :
, - : -->
<Label Padding="20,5" Background="Orange">20,5</Label>
<!-- 4 : , , , : -->
<Label Padding="0,10,20,30" Background="Orange">0,10,20,30</Label>
<!-- : -->
<Border BorderBrush="Black" BorderThickness="1">
<!-- : -->
<Label Background="Aqua">0</Label>
</Border>
<Border BorderBrush="Black" BorderThickness="1">
<!-- 1 : : -->
<Label Margin="10" Background="Aqua">10</Label>
</Border>
<Border BorderBrush="Black" BorderThickness="1">

130

4. ,

<!-- 2 :
, - : -->
<Label Margin="20,5" Background="Aqua">20,5</Label>
</Border>
<Border BorderBrush="Black" BorderThickness="1">
<!-- 4 : , , , : -->
<Label Margin="0,10,20,30" Background="Aqua">0,10,20,30</Label>
</Border>

Label Padding 5,
. 4.1
Padding 0.
, (,
Margin, 0),
Padding .


Thickness
, Margin
Padding, , System.Windows.Thick
nessConverter, Thickness .
Thickness :
double, . , C#
:
myLabel.Margin = new Thickness(10);
// , Margin="10" XAML
myLabel.Margin = new Thickness(20,5,20,5); // , Margin="20,5" XAML
myLabel.Margin = new Thickness(0,10,20,30); // , Margin="0,10,20,30" XAML

,
!

FAQ
WPF?
LengthConverter, ,
, cm, pt, in px (
).
(, ,
) .
1/96
, (DPI). ,

, .

131

1/96 , ,
96 DPI
. ,
.
1 ,
, , !
, .

. ,
, .

Visibility
, Visibility (
UIElement) ,
. Visibility Boolean,
System.Windows.Visibility ,
:
Visible .
Collapsed .
Hidden , .
(Collapsed) , , ,
(Hidden) . (,
ActualHeight ActualWidth .)
Collapsed Hidden . 4.3,
StackPanel :
<StackPanel Height="100" Background="Aqua">
<Button Visibility="Collapsed">Collapsed Button</Button>
<Button>Below a Collapsed Button</Button>
</StackPanel>

StackPanel :
<StackPanel Height="100" Background="Aqua">
<Button Visibility="Hidden">Hidden Button</Button>
<Button>Below a Hidden Button</Button>
</StackPanel>

.4.3. ,

132

4. ,



(X,Y).
( ),
( ,
, ).
, Frame
workElement, .
, .

HorizontalAlignment VerticalAlignment
,
. ,
System.Windows:
HorizontalAlignment Left, Center, Right, Stretch
VerticalAlignment Top, Center, Bottom, Stretch
Stretch,
.
, HorizontalAlignment ,
Button StackPanel
:
<StackPanel>
<Button HorizontalAlignment="Left"
Background="Red">Left</Button>
<Button HorizontalAlignment="Center"
Background="Orange">Center</Button>
<Button HorizontalAlignment="Right"
Background="Yellow">Right</Button>
<Button HorizontalAlignment="Stretch"
Background="Lime">Stretch</Button>
</StackPanel>

.4.4.

.4.4. HorizontalAlignment
StackPanel

133

, , . ,
VerticalAlignment StackPanel, . 4.4, , , , .


Stretch

(Stretch)
,
Height Width. MaxHeight MaxWidth
, , ,
. MinHeight MinWidth
, ,
. Stretch ,
, Center
( Left,
).


HorizontalAlignment VerticalAlignment, Control
HorizontalContentAlignment VerticalContentAlignment.
. (

, .)
, ,
, ,
, .
HorizontalContentAlignment Left, VerticalContentAlignment Top.
,
. (
,
. ,
, .)
.4.5 , Horizon
talContentAlignment.
XAML-:
<StackPanel>
<Button HorizontalContentAlignment="Left"
Background="Red">Left</Button>
<Button HorizontalContentAlignment="Center"
Background="Orange">Center</Button>

134

4. ,

<Button HorizontalContentAlignment="Right"
Background="Yellow">Right</Button>
<Button HorizontalContentAlignment="Stretch"
Background="Lime">Stretch</Button>
</StackPanel>

Button .4.5, HorizontalContentAlignment="Stretch",


. TextBlock
, TextBlock Control (
FrameworkElement),
.

.4.5. HorizontalContentAlignment
StackPanel

FlowDirection
FlowDirection, FrameworkElement (
),
. ,
,
. System.
Windows.FlowDirection, : LeftToRight (
FrameworkElement) RightToLeft.
FlowDirection , ,
, RightToLeft.
,
. XAML ,
Top Left,
FlowDirection :
<StackPanel>
<Button FlowDirection="LeftToRight"
HorizontalContentAlignment="Left" VerticalContentAlignment="Top"
Height="40" Background="Red">LeftToRight</Button>
<Button FlowDirection="RightToLeft"
HorizontalContentAlignment="Left" VerticalContentAlignment="Top"
Height="40" Background="Orange">RightToLeft</Button>
</StackPanel>

.4.6.

135

.4.6. FlowDirection
Top Left

, FlowDirection
.
, .
,
, .
FlowDirection
( ).
.


WPF
( System.Windows.Media.Transform),

.
, .
FrameworkElement Transform,
:
LayoutTransform
RenderTransform ( UIElement)
( )
.4.7
RotateTransform LayoutTransform RenderTransform.
.
LayoutTransform, ,
RenderTransform, ,
.
UIElement RenderTransformOrigin,
(
). RotateTransform .4.7
, .
, LayoutTransform,
,
, .

136

4. ,

, LayoutTransform

, RenderTransform

.4.7. LayoutTransform
RenderTransform StackPanel

RenderTransformOrigin System.Windows.Point
(0,0). ,
.4.7. (0,1) , (1,0)
, (1,1) . ,
1, .
. , (0.5,0.5)
. . 4.8 ,
RenderTransformOrigin.
(0,0)

(0,1)

(1,0)

(1,1)

(0.5,0.5)

.4.8. RenderTransformOrigin,
, .4.7

System.Windows.PointConverter RenderTransform
Origin XAML , (
). , Button,
( .4.8):
<Button RenderTransformOrigin="0.5,0.5" Background="Orange">
<Button.RenderTransform>
<RotateTransform Angle="45"/>
</Button.RenderTransform>
Rotated 45
</Button>

137

, ,
. ,
.
,

.

, System.Windows.Media:
RotateTransform
ScaleTransform
SkewTransform
TranslateTransform
MatrixTransform

RotateTransform
RotateTransform,
,
double:
Angle ( 0)
CenterX ( 0)
CenterY ( 0)
(CenterX,CenterY), (0,0),
. CenterX CenterY ,
RenderTransform,
LayoutTransform
.

FAQ
CenterX CenterY
RotateTransform
RenderTransformOrigin UIElement?
, ,
UIElement, CenterX CenterY ,
RenderTransformOrigin.
,
RenderTransform.
CenterX CenterY ,
RenderTransformOrigin .
,
Width, 20, CenterX 20, CenterY 0, (1,0),

138

4. ,

RenderTransformOrigin. ,
RenderTransform (. ) CenterX CenterY
. ,
CenterX CenterY double
, RenderTransformOrigin Point.
RenderTransformOrigin, , ,
CenterX CenterY. ,
, (0.5,0.5),
RenderTransformOrigin, XAML.
CenterX CenterY ,
.
, RenderTransformOrigin
CenterX CenterY .
X Y
.

.4.7 4.8 , .4.9


, , RotateTransform
RenderTransform
RenderTransformOrigin.
Button TextBlock:
<Button Background="Orange">
<TextBlock RenderTransformOrigin="0.5,0.5">
<TextBlock.RenderTransform>
<RotateTransform Angle="45"/>
</TextBlock.RenderTransform>
45
</TextBlock>
</Button>

, TextBlock Button .4.9


, ,
TextBlock .
,
(.4.10).

.4.9. RotateTransform
StackPanel

139

.4.10. TextBlock,
,

RotateTransform ,
,
.

ScaleTransform
ScaleTransform
, .
double:
ScaleX ( 1)
ScaleY ( 1)
CenterX (
0)
CenterY (
0)
ScaleX 0.5, ,
ScaleX 2, . CenterX CenterY
, RotateTransform.
4.2 ScaleTransform
Button StackPanel,
. .4.11 .
4.2. ScaleTransform StackPanel
<StackPanel Width="100">
<Button Background="Red">No Scaling</Button>
<Button Background="Orange">
<Button.RenderTransform>
<ScaleTransform ScaleX="2"/>
</Button.RenderTransform>
X</Button>
<Button Background="Yellow">
<Button.RenderTransform>
<ScaleTransform ScaleX="2" ScaleY="2"/>
</Button.RenderTransform>
X + Y</Button>
<Button Background="Lime">
<Button.RenderTransform>
<ScaleTransform ScaleY="2"/>

140

4. ,

</Button.RenderTransform>
Y</Button>
</StackPanel>

.4.11. , 4.2

.4.12 4.2,
CenterX CenterY.
. ,
, , CenterX 70.
, CenterX , ScaleX
1, CenterY ScaleY 1.
, ScaleTransform
.

.4.12. 4.2,


ScaleTransform Stretch
ScaleTransform LayoutTransform
, ,
,
, .

141

FAQ
, ScaleTransform,
ActualHeight ActualWidth FrameworkElement
RenderSize UIElement?
FrameworkElement
.
RenderTransform LayoutTransform. -

. , .4.11 4.12 ActualHeight, Actual
Width RenderSize .
, , . -
, ,
. , , ,
, .
, ,
.

FAQ
ScaleTransform Margin
Padding?
Padding (
), Margin .
ActualHeight ActualWidth, Padding
, .

SkewTransform
SkewTransform
double:
AngleX ( 0)
AngleY ( 0)
CenterX ( 0)
CenterY ( 0)

. .4.13 Skew
Transform RenderTransform ;
.

142

4. ,

.4.13. SkewTransform
StackPanel

TranslateTransform
TranslateTransform
double:
X ( 0)
Y ( 0)
TranslateTransform ,
LayoutTransform, RenderTransform
.
(, , ). ,
, ,

.

MatrixTransform
MatrixTransform
.
Matrix ( System.Windows.Media.Matrix),
33.
, ,
( ) MatrixTransform.
:
M11

M12

M21

M22

OffsetX

OffsetY

,
Matrix ( )

143

,
.


MatrixTransform
MatrixTransform ,
XAML . (
TransformConverter , Transform,
MatrixTransform.) ,
10 20 ,
:
<Button RenderTransform="1,0,0,1,10,20" />

: M11, M12, M21,


M22, OffsetX, OffsetY. 1, 0, 0, 1, 0, 0
( ),
TranslateTransform MatrixTransform, , ,
, OffsetX OffsetY
X Y TranslateTransform.
,
ScaleX ScaleY , ,
. ,
sin cos , .
,
XAML- , (
).


,
.
LayoutTransform RenderTransform.
MatrixTransform,
. , , Trans
formGroup.
TransformGroup Transform (
, ),
Transform.

Children, XAML :
<Button>
<Button.RenderTransform>
<TransformGroup>
<RotateTransform Angle="45"/>

144

4. ,

<ScaleTransform ScaleX="5" ScaleY="1"/>


<SkewTransform AngleX="30"/>
</TransformGroup>
</Button.RenderTransform>
OK
</Button>

.4.14 .

.4.14. , ,

WPF
TransformGroup,
(
MatrixTransform). ,
TransformGroup
. , RotateTransform 45,
90.

,
.
,
Win32, Windows Forms:
!

. StackPanel,
, .

145

FrameworkElement !
, WPF,
, LayoutTransform RenderTransform.
, HwndHost,
GDI- ( 19
). Frame, , ,
HTML- ( 9
), ,
HTML. ScaleTransform
, .
.4.15 , , StackPanel
Frame, - (
100100). ,
, .
.

StackPanel

StackPanel
.4.15. Frame, HTML,
ScaleTransform,

Canvas
StackPanel
WrapPanel
DockPanel
Grid


: ,
,

5.

,
,
. ,
, ,
, - ,
:
,
, , ,
(,
). , ,
( ),
.
1024600. Outlo
ok2010 , , Vi
sual Studio 2010, .
(6001024), Outlook 2010
, ( Visual Studio 2010)
. ( , Visual Studio,
, WPF, Outlook WPF.
,
, ,
.)
WPF ,
.
( System.Windows.Controls)
():
Canvas
StackPanel

Canvas

147

WrapPanel
DockPanel
Grid


.
( ,

) .
,
,
, Visual Studio. , WPF,
.

Canvas
Canvas () . ,
. Canvas

; ,
,
. Canvas
, .


: Left, Top, Right Bottom. Left Right,
,
.
Top Bottom. , ,
,
( Margin
).
( Double.NaN),
( Left Top
0). Canvas 5.1,
.5.1.
5.1. Canvas
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Buttons in a Canvas">
<Canvas>
<Button Background="Red">Left=0, Top=0</Button>
<Button Canvas.Left="18" Canvas.Top="18"
Background="Orange">Left=18, Top=18</Button>
<Button Canvas.Right="18" Canvas.Bottom="18"
Background="Yellow">Right=18, Bottom=18</Button>
<Button Canvas.Right="0" Canvas.Bottom="0"
Background="Lime">Right=0, Bottom=0</Button>

148

5.

<Button Canvas.Right="0" Canvas.Top="0"


Background="Aqua">Right=0, Top=0</Button>
<Button Canvas.Left="0" Canvas.Bottom="0"
Background="Magenta">Left=0, Bottom=0</Button>
</Canvas>
</Window>

.5.1. Canvas 5.1

Canvas!
Canvas.Left Canvas.Right
.
Canvas.Top Canvas.Bottom Canvas.Bottom.
, .

.5.1 ,
,
Canvas.
5.1. Canvas

Canvas

Margin

. ,
( Top Left),

HorizontalAlignment
VerticalAlignment

.
,

LayoutTransform

. RenderTransform ,
LayoutTransform
Canvas

Canvas

149

Z- (,
) .
XAML .
, , ,
. , .5.1 ,
. ,
( , Canvas), ,
RenderTransform (
.4.7, 4.8, 4.11, 4.12 4.13 ).
Z- ,
ZIndex, Panel (
). ZIndex , 0;
( ).
ZIndex ,
ZIndex ,
.
ZIndex ,
, Canvas :
<Canvas>
<Button Canvas.ZIndex="1" Background="Red">On Top!</Button>
<Button Background="Orange">On Bottom with a Default ZIndex=0</Button>
</Canvas>

ZIndex,
Children
, .
, Z-
ZIndex. ,
,
. C# (
, redButton):
Panel.SetZIndex(redButton, 0);

Canvas
, .
,
. , Canvas

(. 15 ).

150

5.

StackPanel
StackPanel - .
, .
StackPanel,

. StackPanel
,
!


StackPanel
FlowDirection RightToLeft, StackPanel
,
, .


Orientation ( System.
Windows.Controls.Orientation), Horizontal
Vertical. Vertical. .5.2
, Background
Content, StackPanel
.

Vertical

Horizontal

.5.2. StackPanel

.5.2 ,
,
StackPanel.

151

StackPanel

5.2. StackPanel

StackPanel

Margin

. Margin
StackPanel,

HorizontalAlignment
VerticalAlignment

,
(
, ). Orient at i
on="Vertical", VerticalAlignment.
Orientation="Horizontal", Horizontal
Alignment

LayoutTransform

. RenderTransform ,
LayoutTransform ,
.
Stretch RotateTransform SkewTransform,
LayoutTransform,
, 90

LayoutTransform .5.2
. .5.3 , ,
,
,
. StackPanel,
, .
,
LayoutTransform; RenderTransform .
80

90

.5.3. 80, 90
LayoutTransform

152

5.




, System.Windows.Controls. Virtualizing
Panel. VirtualizingStackPanel,
, StackPanel,
, ( ).
VirtualizingStackPanel ,
- , ListBox
. TreeView,
10 .
DataGridCellsPanel DataGridRowsPresenter,
DataGrid (. 11 ,
).

WrapPanel
WrapPanel StackPanel.
,
.
, ,
, , Windows.
StackPanel, WrapPanel
. WrapPanel
, :
Orientation StackPanel ,
Horizontal.
, Win
dows: ,
, .
, Windows:
, ,
.
ItemHeight .
,
VerticalAlignment, Height . ,
ItemHeight, .
ItemWidth .
,
HorizontalAlignment, Width . ,
ItemWidth, .
ItemHeight ItemWidth (,
Double.NaN). WrapPanel

WrapPanel

153

,
,
, .
, .

WrapPanel
. Width (
) Height ( )
Double.MaxValue Double.PositiveInfinity. XAML
x:Static,
System.Double.

.5.4 Wrap
Panel ,
Window. . 5.5
. WrapPanel
ItemHeight/ItemWidth ,
, StackPanel.

.5.4. WrapPanel

.5.5. WrapPanel

.5.3 ,
, WrapPanel.

154

5.


WrapPanel
FlowDirection RightToLeft, WrapPanel
,
.

5.3. WrapPanel

WrapPanel

Margin

. , WrapPanel
,

HorizontalAlignment
VerticalAlignment

. ,
,
StackPanel.
, ItemHeight ItemWidth
,

LayoutTransform

. RenderTransform ,
LayoutTransform ,
, ItemHeight
ItemWidth ( ).
Stretch RotateTransform
SkewTransform, LayoutTransform,
, 90,
StackPanel

WrapPanel
Window,
. , 10.

DockPanel
DockPanel
, . ( Can
vas , ,
.) , DockPanel ,
, .
DockPanel Dock ( System.Win
dows.Controls.Dock),
. : Left (

DockPanel

155

, Dock ), Top, Right Bottom.


, Dock Fill, ,
. ,
,
DockPanel, LastChildFill false. LastChildFill
true ( ), Dock,
, . false,
( , Left).
.5.6 DockPanel (LastChildFill
true), :
<DockPanel>
<Button DockPanel.Dock="Top" Background="Red">1 (Top)</Button>
<Button DockPanel.Dock="Left" Background="Orange">2 (Left)</Button>
<Button DockPanel.Dock="Right" Background="Yellow">3 (Right)</Button>
<Button DockPanel.Dock="Bottom" Background="Lime">4 (Bottom)</Button>
<Button Background="Aqua">5</Button>
</DockPanel>

().

.5.6. DockPanel

StackPanel,
HorizontalAlignment VerticalAlign
ment. ,
DockPanel, . .5.7 ,
, , ,
HorizontalAlignment VerticalAlignment:
<DockPanel>
<Button DockPanel.Dock="Top" HorizontalAlignment="Right"
Background="Red">1 (Top, Align=Right)</Button>
<Button DockPanel.Dock="Left" VerticalAlignment="Bottom"
Background="Orange">2 (Left, Align=Bottom)</Button>
<Button DockPanel.Dock="Right" VerticalAlignment="Bottom"
Background="Yellow">3 (Right, Align=Bottom)</Button>

156

5.

<Button DockPanel.Dock="Bottom" HorizontalAlignment="Right"


Background="Lime">4 (Bottom, Align=Right)</Button>
<Button Background="Aqua">5</Button>
</DockPanel>

, ,
, .

.5.7. DockPanel

DockPanel
Window Page,
, . ,
(Menu),
- , (StatusBar).
.
,
,
. ( , ,
, .)
. 5.8 , . 5.6,
( ). ,
.

.5.8. DockPanel, , .5.6

157

DockPanel

DockPanel ,
. ,
. . 5.9
DockPanel ,
, .

.5.9.

, DockPanel StackPanel. Last


ChildFill false, DockPanel , Stack
Panel, ,
.
.5.4 ,
, DockPanel.
5.4. DockPanel

DockPanel

Margin

. Margin ,
,

HorizontalAlignment
VerticalAlignment

. StackPanel,
. , Dock
Left Right, Horizon
talAlignment, Top Bottom VerticalAlignment.
, ,
, HorizontalAlignment VerticalAlignment

LayoutTransform

. RenderTransform ,
LayoutTransform ,
. Stretch
RotateTransform SkewTransform,
LayoutTransform, ,
90, ,
(
)

158

5.

Grid
Grid () , ,
. ( Visual Studio Expression Blend Grid
.)
,
( WrapPanel). ,
. Grid
TABLE HTML.

WPF Table ( System.Windows.Documents),


, Grid. Table
Panel ( UIElement). , Framework
ContentElement,
11.


, Grid
, Visual Studio.
5.2 42,
Label GroupBox.
5.2. ,
Visual Studio
<Grid Background="LightBlue">
<!-- : -->
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<!-- : -->
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<!-- : -->
<Label Grid.Row="0" Grid.Column="0" Background="Blue"Foreground="White"
HorizontalContentAlignment="Center">Start Page</Label>
<GroupBox Grid.Row="1" Grid.Column="0" Background="White"
Header="Recent Projects">...</GroupBox>

Grid

159

<GroupBox Grid.Row="2" Grid.Column="0" Background="White"


Header="Getting Started">...</GroupBox>
<GroupBox Grid.Row="3" Grid.Column="0" Background="White"
Header="Headlines">...</GroupBox>
<GroupBox Grid.Row="1" Grid.Column="1" Background="White"
Header="Online Articles">
<ListBox>
<ListBoxItem>Article #1</ListBoxItem>
<ListBoxItem>Article #2</ListBoxItem>
<ListBoxItem>Article #3</ListBoxItem>
<ListBoxItem>Article #4</ListBoxItem>
</ListBox>
</GroupBox>
</Grid>

,
RowDefinition ColumnDefinition ,
RowDefinitions ColumnDefinitions. (
, ,
.)
Row Column, ,
0. ,
.
Grid.Row Grid.Column, 0.
, , ,
.
Z-.
Canvas, , ,
, .
.5.10 5.2.

.5.10.
Visual Studio

160

5.

: (Online articles)
. , , Start Page
. ,
Grid: RowSpan ColumnSpan.
RowSpan ColumnSpan 1,
, 1,
, . (
, ,
.) , Group
Box 5.2
Grid.RowSpan="3"

Label
Grid.ColumnSpan="2"

, .5.11.

.5.11. RowSpan ColumnSpan


Visual Studio

.5.11 ,
.
,
. ,
,
.
Height Width RowDefini
tion ColumnDefinition Auto,
. 5.2:
<!-- : -->
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>

Grid

161

<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<!-- : -->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>

, .5.12.

.5.12.

FAQ
Grid ,
HTML-?
,
, , ,
. ,
Rectangle,
Fill, . ,
Margin
. ,
, ( Stroke)
Border.
, Rectangle Border
(
ZIndex), Z-
.

162

5.

Grid ShowGridLines; true,


- .
, .
. 5.13 ShowGridLines="True" ,
.5.12.

.5.13. ShowGridLines Grid


FrameworkElement, Height Width
RowDefinition ColumnDefinition Auto ( Double.
NaN). , Height Width WPF,
System.Windows.GridLength, double. Grid
RowDefinition ColumnDefinition:
Height Width ,
(
Height Width WPF).
,
Grid
.
Height Width Auto (
),
, , (
Height Width WPF ).
,
. ,
,
- .

Grid

163

) Height
Width,
.
,
.

,
.
:
*,
.
* ,
.
* (, 2* 5.5*),

, ,
*. 2*
* ( , 1*)
. 5.5* 2.75*
.

,
. .5.14
.
*.
. 5.10 5.11
.

.5.14.

164

5.

FAQ
WPF
, HTML?
HTML
100%
HorizontalAlignment VerticalAlignment
Stretch. Grid
,
. , , 25% ,
* ,
3*.
WPF ,
, 100
. ,
(
), , HTML-
.


GridLength
System.Windows.GridLengthConverter "100",
"auto" "2*" GridLength. C# GridLength
.
GridUnitType, .
,
double (, 100):
GridLength length = new GridLength(100);

, GridUnitType:
GridLength length = new GridLength(100, GridUnitType.Pixel);

100 .
GridLength Double.NaN,
GridUnitType.Auto:
GridLength length = new GridLength(0, GridUnitType.Auto);

, , . ,
GridLength.Auto,
GridLength, ,
.
GridUnitType.Star:
GridLength length = new GridLength(2, GridUnitType.Star);

2* XAML. *,
1, GridUnitType.Star.

165

Grid

GridSplitter
Grid
(
, ).
GridSplitter .
Grid GridSplitter,
Grid.Row, Grid.Column, Grid.RowSpan /
Grid.ColumnSpan, . GridSplitter
.

: - .
,
, GridSplitter. . 5.5
, Grid
Splitter (
).

GridSplitter ,
( )
( ).
ColumnSpan RowSpan, .

5.5. , GridSplitter

HorizontalAlignment

VerticalAlignment

Left

Right

Center

Stretch

Top

Bottom

Center

Stretch

,
GridSplitter
,
, GridSplitter

166

5.

GridSplitter HorizontalAlignment Right,


VerticalAlignment Stretch,
. GridSplitter
, Stretch
.
, .5.5.

, GridSplitter
. ,

( ).
, .
, ,
, ,
.
, ,
GridSplitter, ,
: ResizeDirection ( Grid
ResizeDirection) ResizeBehavior ( GridResizeBehavior). Resi
zeDirection ( ) Auto,
Rows Columns, , ,
GridSplitter (
.5.5). ResizeBehavior ( )
BasedOnAlignment, ,
. 5.5. PreviousAndCurrent, CurrentAndNext
PreviousAndNext, ,
.

GridSplitter
.
. GridSplitter
, (
ZIndex), Z- !


RowDefinitions ColumnDefinitions SharedSizeGroup,
,
/ ,
(
, GridSplitter). SharedSizeGroup
( );

167

Grid

. ,
, .
,
.5.15; SharedSizeGroup :
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Background="Red"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center">1
</Label>
<GridSplitter Grid.Column="0" Width="5"/>
<Label Grid.Column="1" Background="Orange"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center">2
</Label>
<Label Grid.Column="2" Background="Yellow"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center">3
</Label>
</Grid>

,
Label GridSplitter.
.
,
.
GridSplitter

GridSplitter


GridSplitter

.5.15. SharedSizeGroup

GridSplitter ,
Width ( Height )
.

168

5.

.5.16 , ,
SharedSizeGroup.

.
.
,
.
XAML- .
<Grid IsSharedSizeScope="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="myGroup"/>
<ColumnDefinition/>
<ColumnDefinition SharedSizeGroup="myGroup"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Background="Red"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center">1
</Label>
<GridSplitter Grid.Column="0" Width="5"/>
<Label Grid.Column="1" Background="Orange"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center">2
</Label>
<Label Grid.Column="2" Background="Yellow"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center">3
</Label>
</Grid>
GridSplitter

GridSplitter


GridSplitter

.5.16. , .5.15,
SharedSizeGroup

IsSharedSizeScope ,
!
(
), ,
SharedSizeGroup, ,
IsSharedSizeScope true.

Grid

169

Grid, ,
, , :
<StackPanel Grid.IsSharedSizeScope="True">
<Grid>... SharedSizeGroup...</Grid>
<Grid>... SharedSizeGroup...</Grid>
<WrapPanel>
<Grid>... SharedSizeGroup...</Grid>
</WrapPanel>
</StackPanel>

: , ,
, Visual Studio
SharedSizeGroup ,
.

Grid
Grid ,
, , .
, ,
, WrapPanel.
, .
, , .5.12,
, DockPanel StackPanel. DockPanel
, Label,
StackPanel (
GroupBox). GroupBox .
, Grid
, ,
, ,
Grid.

Canvas Grid

HorizontalAlignment VerticalAlignment,
Stretch,
, Canvas. HorizontalAlignment
Left VerticalAlignment Top Canvas.
Left Canvas.Top 0. HorizontalAlignment Right Ver
ticalAlignment Bottom Canvas.Right Can
vas.Bottom 0. , Margin
,
Canvas. Visual Studio,

.

170

5.

StackPanel Grid

, StackPanel,
.
,
,
.

DockPanel Grid
RowSpan ColumnSpan ,

DockPanel. . 5.12 Label, ,
.
.5.6 ,
, Grid.
5.6. Grid

DockPanel

Margin

. Margin ,

HorizontalAlignment
VerticalAlignment

. ,
, ,

.
,

LayoutTransform

. RenderTransform ,
LayoutTransform (
) Margin.
RenderTransform, ,
,

, Grid ,
, ,
StackPanel WrapPanel (
, 10). , DockPanel
Grid, ,
, ,
. ,

RowSpan ColumnSpan.

171



, .
WPF ,
, ,
(. 14 , , )
(. 20
). ,
, .
System.Windows.Controls.Primitives,
ToolBarTray, System.Windows.Controls.

TabPanel
TabPanel WrapPanel, ,
, , .
,
TabControl, .
WrapPanel,
. ,
, .
TabControl 10.

ToolBarPanel
ToolBarPanel, ToolBar,
StackPanel.
(. ) , (
ToolBar). ToolBar
10.

ToolBarOverflowPanel
ToolBarOverflowPanel WrapPanel,

. ToolBar
.
WrapPanel WrapWidth,
, Padding. ,
WrapPanel.

ToolBarTray
ToolBarTray ToolBar (
InvalidOperationException
). ToolBar (

172

5.

) ,
, ToolBar.

UniformGrid
UniformGrid , .
Grid,
*, . - UniformGrid
double, ,
RowDefinitions ColumnDefi
nitions. , ;
,
.
, (
), Uniform
Grid . ,
2 4, 22, 5 9
33, 10 16 44 .. .5.17 ,
UniformGrid, .

.5.17. UniformGrid

SelectiveScrollingGrid
SelectiveScrollingGrid Grid,
DataGridRow.
Grid ,
. Selective
ScrollingOrientation, :
None
Horizontal
Vertical
Both .

173


,
.
, , ,
, .
, , ,
. ListBox
, Window.
.
:





.
WrapPanel ( TabPanel Tool
BarOverflowPanel).
( 11).
.
TextBlock AccessText,
TextTrimming ( System.Windows.TextTrimming), None
( ), CharacterEllipsis WordEllipsis.
(),
.

,
, .
(,
DockPanel). ,
- .
, UIElement, ClipTo
Bounds, ,
. ,
Window Page, .
Window. (
7 .)
, ClipToBounds,

. Canvas UniformGrid
, ClipToBounds
true, .

174

5.

.5.18 , ClipToBounds
, Canvas ( ).

ClipToBounds="False"

ClipToBounds="True"

.5.18. ClipToBounds ,

, , ClipToBounds true,
Canvas ; Height Width 0,
, Canvas !
, Control,
ClipToBounds. , Button
ClipToBounds false. .5.19 , ,
true,
ScaleTransform (
RenderTransform).

ClipToBounds="False"

ClipToBounds="True"

.5.19. ClipToBounds
(, Button)

Canvas
. ,
Grid ,
Canvas ( ), Canvas Button.
, ,
, Grid, .

, ,
, RowSpan / ColumnSpan.

175


RenderTransform!
ScaleTransform
RenderTransform, ,
( , Window
Page). ScaleTransform RenderTransform
.
- , ,
,
! ,
RenderTransform .
Scale
Transform, LayoutTransform ,
.


, - . WPF
System.Windows.
Controls.ScrollViewer, . ScrollVie
wer ScrollBar,
, .
ScrollViewer Content,
- ,
. Content XAML,
, ,
:
<Window Title="Using ScrollViewer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ScrollViewer>
<StackPanel>
...
</StackPanel>
</ScrollViewer>
</Window>

.5.20 Window, StackPanel,


ScrollViewer .
ScrollBar ,
,
Page Up Page Down
Ctrl+Home Ctrl+End .

176

5.

.5.20. ScrollViewer ,

ScrollViewer
, VerticalScroll
BarVisibility HorizontalScrollBarVisibility.
ScrollBarVisibility, :
Visible , .
,
. ( , Disabled
ScrollBarVisibility.)
Auto ,
. .
Hidden , ,
.
.
Disabled ,
, ,
. ,
.
VerticalScrollBarVisibility Visible,
HorizontalScrollBarVisibility Auto,
.
ScrollViewer Hid
den Disabled . , .5.21
Window, ScrollViewer,
WrapPanel. ,
HorizontalScrollBarVisibility Hidden,
Disabled.
Hidden WrapPanel ,
( HorizontalScrollBarVisibility Visible Auto),
.
Disabled ,

177

Window, ,
ScrollViewer .

HorizontalScrollBarVisibility="Hidden"

HorizontalScrollBarVisibility="Disabled"

.5.21. ,
HorizontalScrollBarVisibility
WrapPanel

3 WPF ,
ListBox ScrollViewer.
, VerticalScroll
BarVisibility HorizontalScrollBarVisibility
ScrollViewer:
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
...
</ListBox>


,

. , ,
. ,
.
.5.22 ,
( XAML
20). Canvas,
Window. ,
( Grid, Canvas).
, .

178

5.

.5.22. , ,

ScaleTransform
( ),

. ,
System.Windows.Controls.Viewbox
.
Viewbox ,
, .
Border, System.Windows.Controls.Decorator.
Viewbox ( )
, .
Stretch, ,
.
System.Windows.Media.Stretch
( .5.23, Viewbox
Canvas):
None . ,
Viewbox .
Fill ,
Viewbox.
.
Uniform ,
Viewbox . ,
Viewbox ,
.
.
UniformToFill ,
Viewbox . ,
Viewbox ,
.
, ,
,

179

. .5.23 Viewbox Window,


, ,
.

Stretch="None"

Stretch="Fill"

Stretch="Uniform"

Stretch="UniformToFill"

.5.23. Stretch
Viewbox

Viewbox , :
, .
StretchDirection, System.Windows.Controls.Stretch
Direction :
UpOnly , .
, Viewbox .
DownOnly , .
, Viewbox .
Both
Stretch.
.
,
. Window,
.5.20:

180

5.

<Window Title="Using ScrollViewer"


xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ScrollViewer>
<StackPanel>
...
</StackPanel>
</ScrollViewer>
</Window>

ScrollViewer Viewbox ( ),
, .5.24:
<Window Title="Using Viewbox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Viewbox>
<StackPanel>
...
</StackPanel>
</Viewbox>
</Window>

, !

.5.24. StackPanel, .5.20,


Viewbox, ScrollViewer

Viewbox !
Viewbox , ,
,
WrapPanel. ,
, ,
( ). .5.25
WrapPanel,
.5.21, ScrollViewer Viewbox.

181

.5.25. WrapPanel, .5.21,


, ScrollViewer, Viewbox
,
, . Stretch
Direction UpOnly Both
. Viewbox
. UpOnly ,
- , .5.26.

.5.26. Viewbox, .5.25,


StretchDirection="UpOnly" ,
WrapPanel
HorizontalScrollBarVi
sibility="Hidden" .5.21 ,
, , .

182

5.

: ,
,
WPF ,
.
Visual Studio ,

. ,
, ,
. ,
, . .5.275.33

.

.5.27. ,

.5.28. Toolbox,
Toolbox, ,

: , ,

183

.5.29. ,

.5.30. Toolbox,
,
, Toolbox

.5.31. -
GridSplitter,

184

5.

.5.32. Solution Explorer,


Solution Explorer,
( Toolbox).
,

.5.33. Solution Explorer ,


. Toolbox ,
, , ,

,
.
( .5.33), , Grid
, , .
?
,
Grid GridSplitter.
.

, .

.
, (

: , ,

185

), SharedSizeGroup. .5.34
, .
0
,

Width=*

SharedSizeGroup #1
1
1

Width=*

Width=Auto

SharedSizeGroup #2
2
2

Width=*

Width=Auto

.5.34. Grid
, ,

( 0) , ,
, , .
1
2 Collapsed Visible.
, ( ,
, , 0).
, .
1
0 1. 0

186

5.

, 1.
, SharedSizeGroup,
1 .
2,
(0 1).
,
0
, . ,
, , .
( ?)
,
, . Z- 0
, Z- ,
.
5.3 XAML- , .5.27
5.33, .
, ( http://
informit.com/title/9780672331190).
5.3. VisualStudioLikePanes.xaml XAML-
, .5.275.33
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Application with Collapsible, Dockable, Resizable Panes">
<DockPanel>
<Menu DockPanel.Dock="Top">
...
</Menu>
<!-- , : -->
<StackPanel Name="buttonBar" Orientation="Horizontal" DockPanel.Dock="Right">
<StackPanel.LayoutTransform>
<RotateTransform Angle="90"/>
</StackPanel.LayoutTransform>
<Button Name="pane1Button" MouseEnter="pane1Button_MouseEnter">
Toolbox
</Button>
<Button Name="pane2Button" MouseEnter="pane2Button_MouseEnter">
Solution Explorer
</Button>
</StackPanel>
<!-- , , DockPanel: -->
<Grid Name="parentGrid" Grid.IsSharedSizeScope="True">
<!-- 0: -->
<Grid Name="layer0" MouseEnter="layer0_MouseEnter">

: , ,

187

... ( , 5.2)
</Grid>
<!-- 1: -->
<Grid Name="layer1" Visibility="Collapsed">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition SharedSizeGroup="column1" Width="auto"/>
</Grid.ColumnDefinitions>
<!-- 0 , 1
Grid GridSplitter: -->
<Grid Grid.Column="1" MouseEnter="pane1_MouseEnter"
Background="{DynamicResource
{x:Static SystemColors.ActiveCaptionBrushKey}}">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<!-- 0 ,
1 - : -->
<DockPanel Grid.Row="0">
<Button Name="pane1Pin" Width="26" DockPanel.Dock="Right"
Click="pane1Pin_Click" Background="White">
<Image Name="pane1PinImage" Source="pinHorizontal.gif"/>
</Button>
<TextBlock Padding="8" TextTrimming="CharacterEllipsis"
Foreground="{DynamicResource
{x:Static SystemColors.ActiveCaptionTextBrushKey}}"
DockPanel.Dock="Left">Toolbox</TextBlock>
</DockPanel>
... ( 1)
</Grid>
<GridSplitter Width="5" Grid.Column="1" HorizontalAlignment="Left"/>
</Grid>
<!-- 2: -->
<Grid Name="layer2" Visibility="Collapsed">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition SharedSizeGroup="column2" Width="auto"/>
</Grid.ColumnDefinitions>
<!-- 0 , 1
Grid GridSplitter: -->
<Grid Grid.Column="1" MouseEnter="pane2_MouseEnter"
Background="{DynamicResource
{x:Static SystemColors.ActiveCaptionBrushKey}}">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>

188

5.

<!-- 0 ,
1 2 - : -->
<DockPanel Grid.Row="0">
<Button Name="pane2Pin" Width="26" DockPanel.Dock="Right"
Click="pane2Pin_Click" Background="White">
<Image Name="pane2PinImage" Source="pinHorizontal.gif"/>
</Button>
<TextBlock Padding="8" TextTrimming="CharacterEllipsis"
Foreground="{DynamicResource
{x:Static SystemColors.ActiveCaptionTextBrushKey}}"
DockPanel.Dock="Left">Solution Explorer
</TextBlock>
</DockPanel>
... ( 1)
</Grid>
<GridSplitter Width="5" Grid.Column="1" HorizontalAlignment="Left"/>
</Grid>
</Grid>
</DockPanel>
</Window>

Window DockPanel,
, StackPanel, (
90 RotateTransform), ,
, . , Menu
DockPanel , StackPanel,
.
- ,
.
GridSplitter ,
.
Label, TextBlock,
TextTrimming="CharacterEllipsis",
,
. .
5.4 C#,
5.3.
5.4. VisualStudioLikePanes.xaml.cs C#-
, .5.275.33
using
using
using
using

System;
System.Windows;
System.Windows.Controls;
System.Windows.Media.Imaging;

public partial class MainWindow : Window


{
// 0 1:
ColumnDefinition column1CloneForLayer0;

: , ,
ColumnDefinition column2CloneForLayer0;
ColumnDefinition column2CloneForLayer1;
public MainWindow()
{
InitializeComponent();
// , ,
//
column1CloneForLayer0 = new ColumnDefinition();
column1CloneForLayer0.SharedSizeGroup = "column1";
column2CloneForLayer0 = new ColumnDefinition();
column2CloneForLayer0.SharedSizeGroup = "column2";
column2CloneForLayer1 = new ColumnDefinition();
column2CloneForLayer1.SharedSizeGroup = "column2";
}
// : / ( 1)
public void pane1Pin_Click(object sender, RoutedEventArgs e)
{
if (pane1Button.Visibility == Visibility.Collapsed)
UndockPane(1);
else
DockPane(1);
}
// : / ( 2)
public void pane2Pin_Click(object sender, RoutedEventArgs e)
{
if (pane2Button.Visibility == Visibility.Collapsed)
UndockPane(2);
else
DockPane(2);
}
// 1,
public void pane1Button_MouseEnter(object sender, RoutedEventArgs e)
{
layer1.Visibility = Visibility.Visible;
// Z-, :
Grid.SetZIndex(layer1, 1);
Grid.SetZIndex(layer2, 0);
// ,
if (pane2Button.Visibility == Visibility.Visible)
layer2.Visibility = Visibility.Collapsed;
}
// 2,
public void pane2Button_MouseEnter(object sender, RoutedEventArgs e)

189

190

5.

{
layer2.Visibility = Visibility.Visible;
// Z-, :
Grid.SetZIndex(layer2, 1);
Grid.SetZIndex(layer1, 0);
// ,
if (pane1Button.Visibility == Visibility.Visible)
layer1.Visibility = Visibility.Collapsed;
}
// ,
// 0
public void layer0_MouseEnter(object sender, RoutedEventArgs e)
{
if (pane1Button.Visibility == Visibility.Visible)
layer1.Visibility = Visibility.Collapsed;
if (pane2Button.Visibility == Visibility.Visible)
layer2.Visibility = Visibility.Collapsed;
}
// , ,
// 1
public void pane1_MouseEnter(object sender, RoutedEventArgs e)
{
// ,
if (pane2Button.Visibility == Visibility.Visible)
layer2.Visibility = Visibility.Collapsed;
}
// , ,
// 2
public void pane2_MouseEnter(object sender, RoutedEventArgs e)
{
// ,
if (pane1Button.Visibility == Visibility.Visible)
layer1.Visibility = Visibility.Collapsed;
}
// ,
//
public void DockPane(int paneNumber)
{
if (paneNumber == 1)
{
pane1Button.Visibility = Visibility.Collapsed;
pane1PinImage.Source = new BitmapImage(new Uri("pin.gif",
UriKind.Relative));
// 0:

: , ,
layer0.ColumnDefinitions.Add(column1CloneForLayer0);
// 1,
// 2 :
if (pane2Button.Visibility == Visibility.Collapsed)
layer1.ColumnDefinitions.Add(column2CloneForLayer1);
}
else if (paneNumber == 2)
{
pane2Button.Visibility = Visibility.Collapsed;
pane2PinImage.Source = new BitmapImage(new Uri("pin.gif",
UriKind.Relative));
// 0:
layer0.ColumnDefinitions.Add(column2CloneForLayer0);
// 1,
// 1 :
if (pane1Button.Visibility == Visibility.Collapsed)
layer1.ColumnDefinitions.Add(column2CloneForLayer1);
}
}
// ,
//
public void UndockPane(int paneNumber)
{
if (paneNumber == 1)
{
layer1.Visibility = Visibility.Visible;
pane1Button.Visibility = Visibility.Visible;
pane1PinImage.Source = new BitmapImage
(new Uri("pinHorizontal.gif", UriKind.Relative));
// 0 1:
layer0.ColumnDefinitions.Remove(column1CloneForLayer0);
// , Remove
// :
layer1.ColumnDefinitions.Remove(column2CloneForLayer1);
}
else if (paneNumber == 2)
{
layer2.Visibility = Visibility.Visible;
pane2Button.Visibility = Visibility.Visible;
pane2PinImage.Source = new BitmapImage
(new Uri("pinHorizontal.gif", UriKind.Relative));
// 0 1:
layer0.ColumnDefinitions.Remove(column2CloneForLayer0);

191

192

5.

// , Remove
// :
layer1.ColumnDefinitions.Remove(column2CloneForLayer1);
}
}
}

C# . ,
,
.
, , ,
, ,
. , StackPanel
,
.
5.4 ( ),

.

, ,
.
,
.
Grid WPF
.
WPF ,
.
,
.

: , ,

6.

, , WPF,
.
WPF
.
: , , .


3 WPF ,
WPF
.NET. WPF
.
.

,
.

( )
WPF. ,
Button Click
MouseLeftButtonDown KeyDown.
, ,
ButtonChrome
TextBlock.
, Button
. Stop,
(. 2 XAML),

194 6. : , ,
, Rectangle.
, Button
. (,
Rectangle
Button, .)
, , Button,
( , 14
, , ),

Click .
,
.

. ,
, ,
.
About
3.



.NET.
, .NET- ( XAML) ,
.
WPF.
6.1 Click
Button. ( Click
Button, .)
,
DependencyProperty
Property.
RoutedEvent
Event. , ,
,
.NET ,
XAML-
.
, ,
AddHandler RemoveHandler.
6.1.
public class Button : ButtonBase
{
//
public static readonly RoutedEvent ClickEvent;

195

static Button()
{
//
Button.ClickEvent = EventManager.RegisterRoutedEvent("Click",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Button));
...
}
// .NET ()
public event RoutedEventHandler Click
{
add { AddHandler(Button.ClickEvent, value); }
remove { RemoveHandler(Button.ClickEvent, value); }
}
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
...
//
RaiseEvent(new RoutedEventArgs(Button.ClickEvent, this));
...
}
...
}

AddHandler RemoveHandler DependencyObject,


UIElement.
. OnMouseLeftButtonDown
RaiseEvent ( UIElement),
RoutedEvent, Click.
Button (this).
, Click
KeyDown,
Enter.




. RoutingStrategy:
Tunneling ,
, ,
(
).
Bubbling -,
,
, (
).

196 6. : , ,
Direct -.

.NET; ,
,
.
,
.NET:
System.Object, sender, (
e) , System.EventArgs.
sender ,
. e RoutedEventArgs
( ) EventArgs,
:
Source ,
.
OriginalSource ,
(, Button
TextBlock ButtonChrome).
Handled , true
, .
.
RoutedEvent (, Button.
ClickEvent),
,
.
Source OriginalSource
, . ,
,
.
(, Click
), Source OriginalSource
.


UIElement
, , .
, .
,
Preview.
. ,
PreviewMouseMove
MouseMove.
, , ,
,
. WPF

197

(
),
, (preview
). , ,
TextBox, ,
(,
). KeyDown,
, , ,
TextBox. PreviewKeyDown,
,
KeyDown.
TextBox KeyDown
.
,
6.2 About 3
Window MouseRightButtonDown. 6.3
C#.
6.2. About

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AboutDialog"
MouseRightButtonDown="AboutDialog_MouseRightButtonDown"
Title="About WPF 4 Unleashed" SizeToContent="WidthAndHeight"
Background="OrangeRed">
<StackPanel>
<Label FontWeight="Bold" FontSize="20" Foreground="White">
WPF 4 Unleashed
</Label>
<Label> 2010 SAMS Publishing</Label>
<Label>Installed Chapters:</Label>
<ListBox>
<ListBoxItem>Chapter 1</ListBoxItem>
<ListBoxItem>Chapter 2</ListBoxItem>
</ListBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button MinWidth="75" Margin="10">Help</Button>
<Button MinWidth="75" Margin="10">OK</Button>
</StackPanel>
<StatusBar>You have successfully registered this product.</StatusBar>
</StackPanel>
</Window>

6.3. 6.2
using
using
using
using

System.Windows;
System.Windows.Input;
System.Windows.Media;
System.Windows.Controls;

198 6. : , ,
public partial class AboutDialog : Window
{
public AboutDialog()
{
InitializeComponent();
}
void AboutDialog_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
//
this.Title = "Source = " + e.Source.GetType().Name + ", OriginalSource = " +
e.OriginalSource.GetType().Name + " @ " + e.Timestamp;
// Control
Control source = e.Source as Control;
// -
if (source.BorderThickness != new Thickness(5))
{
source.BorderThickness = new Thickness(5);
source.BorderBrush = Brushes.Black;
}
else
source.BorderThickness = new Thickness(0);
}
}

MouseRightButtonDown Window,
:
( )
,
. .6.1. ,
Label Source , OriginalSource
TextBlock.

.6.1. About

199


, :
Window MouseRightButtonDown,
ListBoxItem. , ListBoxItem
, MouseLeftButtonDown ( ),
.
Window MouseRightButtonDown Button,
.
Button,
.3.3. Window, Label, ListBox, ListBox
Item StatusBar, Button Border.


!
true Handled RoutedEventArgs

, , ,
,
!
AddHandler,
handledEventsToo.
, 6.2
AddHandler AboutDialog:
public AboutDialog()
{
InitializeComponent();
this.AddHandler(Window.MouseRightButtonDownEvent,
new MouseButtonEventHandler(AboutDialog_MouseRightButtonDown), true);
}

true, AboutDia
log_MouseRightButtonDown
ListBoxItem !
,
, , - .
Preview- .
,
.
, ,
.

200 6. : , ,



, .
WPF
, !
.
,
(

). 6.4 About,
Window Selec
tionChanged, ListBox, Click,
Button. Window
SelectionChanged Click,
, ,
. 6.5 ,
.
MessageBox , .
6.4. About

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AboutDialog"
ListBox.SelectionChanged="ListBox_SelectionChanged"
Button.Click="Button_Click"
Title="About WPF Unleashed" SizeToContent="WidthAndHeight"
Background="OrangeRed">
<StackPanel>
<Label FontWeight="Bold" FontSize="20" Foreground="White">
WPF 4 Unleashed
</Label>
<Label> 2010 SAMS Publishing</Label>
<Label>Installed Chapters:</Label>
<ListBox>
<ListBoxItem>Chapter 1</ListBoxItem>
<ListBoxItem>Chapter 2</ListBoxItem>
</ListBox>
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Center">
<Button MinWidth="75" Margin="10">Help</Button>
<Button MinWidth="75" Margin="10">OK</Button>
</StackPanel>
<StatusBar>You have successfully registered this product.</StatusBar>
</StackPanel>
</Window>

201

6.5. 6.4
using System.Windows;
using System.Windows.Controls;
public partial class AboutDialog : Window
{
public AboutDialog()
{
InitializeComponent();
}
void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
MessageBox.Show("You just selected " + e.AddedItems[0]);
}
void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("You just clicked " + e.Source);
}
}

.
, 6.4,
, XAML .NET SelectionChanged,
ListBox, .NET Click, Button.
AddHandler,
Window.
Window:
public AboutDialog()
{
InitializeComponent();
this.AddHandler(ListBox.SelectionChangedEvent,
new SelectionChangedEventHandler(ListBox_SelectionChanged));
this.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click));
}




,
.
RoutedEvent, , ,
RoutedEventArgs (
, KeyEventArgs, MouseButtonEventArgs ..),
.

202 6. : , ,

, 6.5 ,
ListBox.SelectionChanged Button.Click GenericHandler:
void GenericHandler(object sender, RoutedEventArgs e)
{
if (e.RoutedEvent == Button.ClickEvent)
{
MessageBox.Show("You just clicked " + e.Source);
}
else if (e.RoutedEvent == ListBox.SelectionChangedEvent)
{
SelectionChangedEventArgs sce = (SelectionChangedEventArgs)e;
if (sce.AddedItems.Count > 0)
MessageBox.Show("You just selected " + sce.AddedItems[0]);
}
}

.NET Framework
, ,
(,
RoutedEventArgs SelectionChangedEventArgs). GenericHandler
RoutedEventArgs ,
, SelectionChanged.


, UIEle
ment, KeyDown KeyUp
PreviewKeyDown PreviewKeyUp.
KeyEventArgs, ,
:
Key, ImeProcessedKey, DeadCharProcessedKey, SystemKey ,
Key,
. Key ,
.
(Input Method Editor IME),
ImeProcessedKey.
, Key DeadCharProcessed,
DeadCharProcessedKey.
, Alt, Key System,
SystemKey.
IsUp, IsDown, IsToggled ,
,
. ( KeyDown, ,
!) IsToggled
, Caps Lock Scroll Lock.

203

,

System.Windows.Input PrimaryDevice ( Keyboard
Device).

KeyStates KeyStates, ,

None, Down Toggled.


IsUp, IsDown IsToggled . Togg
led Down, Key
States .
IsXXX.
IsRepeat , true,
. , ,
KeyDown. IsRepeat
true KeyDown, .
KeyboardDevice KeyboardDevice,
, ,
, .
KeyboardDevice
Modifiers ModifierKeys ( ). ,
.
: None, Alt, Control, Shift Windows. ,
,
. ,
, Alt A,
Alt+Shift+A, Alt+Ctrl+A ..:
protected override void OnKeyDown(KeyEventArgs e)
{
if ((e.KeyboardDevice.Modifiers & ModifierKeys.Alt) ==
ModifierKeys.Alt && (e.Key == Key.A || e.SystemKey == Key.A))
{
// Alt+A, , Ctrl, Shift Windows
}
base.OnKeyDown(e);
}

, Alt+A
- :
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyboardDevice.Modifiers == ModifierKeys.Alt
&& (e.Key == Key.A || e.SystemKey == Key.A))
{

204 6. : , ,
// Alt+A Alt+A
}
base.OnKeyDown(e);
}

FAQ
, Alt, Ctrl Shift : ?
Key : LeftAlt RightAlt, LeftCtrl
RightCtrl, LeftShift RightShift. Alt
, System, ,
Alt . ,
IsKeyDown KeyboardDevice ( IsKeyUp IsKeyToggled),
, Alt.
[]Alt+A:
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyboardDevice.Modifiers == ModifierKeys.Alt
&& (e.Key == Key.A || e.SystemKey == Key.A)
&& e.KeyboardDevice.IsKeyDown(Key.LeftAlt))
{
// LeftAlt+A
}
base.OnKeyDown(e);
}

,
, .
( ,
WPF, 19
.) UIElement ,
. , ,
Focusable, true.
FocusableChanged.
UIElement ,
. IsKeyboardFocused,
, , IsKeyboardFo
cusWithin, ,
, . ( ;
, Focus MoveFocus.)
IsKeyboardFocusedChanged, IsKey
boardFocusWithinChanged, GotKeyboardFocus, LostKeyboardFocus, PreviewGotKeyboard
Focus PreviewLostKeyboardFocus.

205


UIElement :
MouseEnter MouseLeave
MouseMove PreviewMouseMove
MouseLeftButtonDown, MouseRightButtonDown, MouseLeftButtonUp, MouseRightBut
tonUp MouseDown MouseUp, Preview-

MouseWheel PreviewMouseWheel
MouseEnter MouseLeave
, Is
MouseOver.
UIElement IsMouseDirectlyOver (
IsMouseDirectlyOverChanged),
. ,
, .

FAQ
?
MouseDown
MouseUp ( Preview-). EventArgs,
, , ,
: LeftButton, RightButton, MiddleButton, XButton1 XButton2.

, (
, ),
false IsHitTestVisible.

, null- !
, IsHitTestVisible
false , ,
, . Visibility
Collapsed, ,
Opacity 0 .
, Background, Fill Stroke null.

206 6. : , ,

. ,
Background, Fill Stroke Transparent (
), . (null (Transparent) ,
.)

MouseEventArgs
( IsMouseDirectly
OverChanged) MouseEventArgs.
MouseButtonState,
: LeftButton, RightButton, MiddleButton, XBut
ton1 XButton2. MouseButtonState : Pres
sed Released. MouseEventArgs GetPosition,
Point X Y,
.
GetPosition , ,
:

UIElement. ,
null.

.
MouseWheel PreviewMouseWheel
MouseWheelEventArgs, MouseEventArgs.
Delta, ,
. 12
MouseUp/MouseDown MouseButtonEventArgs,
MouseEventArgs. ChangedButton,
, (
MouseButton); ButtonState, ,
; ClickCount.
ClickCount ,
, ,
,
( ). Button
Click, MouseLeftButtonDown,
Control MouseDoubleClick,
ClickCount 2 MouseLeftButtonDown, PreviewMouse
DoubleClick, PreviewMouseLeftButtonDown.
,
, ,
..

207

Canvas
, Width Height!
, Width Height
Canvas 0, .
Canvas ( , )
, WidthHeight
( , Background null ).
Canvas
.

UIElement
:
DragEnter, DragOver, DragLeave, PreviewDragEnter, PreviewDragOver Pre
viewDragLeave
Drop PreviewDrop
QueryContinueDrag PreviewQueryContinueDrag

Win32, .
, true
AllowDrop.
Drag
EventArgs, :
GetPosition , MouseEventArgs
Data IDataObject,
Win32
Effects AllowedEffects DragDropEffects,
Copy, Move, Link, Scroll, All None
KeyStates (DragDropKeyStates),
, -
: LeftMouseButton, RightMouseButton, Midd
leMouseButton, ShiftKey, ControlKey, AltKey None
QueryContinueDrag PreviewQueryContinueDrag ,
-
. .
QueryContinueDragEvent
Args, :
KeyStates DragEventArgs

208 6. : , ,
EscapePressed , ,

Esc
Action , ,

; Drag
Action Continue, Drop Cancel

,

System.Windows.Input.Mouse.
Mouse.GetPosition
. GetPo
sition DragEventArgs, , ,
, PInvoke Win32
API GetCursorPos, .


,
UIElement, . ,
MouseLeftButtonDown, MouseMove Mouse
LeftButtonUp.
MouseLeftButtonDown ,
MouseMove ,
, true, MouseLeft
ButtonUp , .
, ,

, ,
.
, WPF UIElement
. ,
,
.
.
UIElement: CaptureMouse ReleaseMouseCapture. (, ,
, , ,
IsMouseCaptured IsMouseCaptureWithin GotMouseCapture, LostMouseCap
ture, IsMouseCaptureChanged IsMouseCaptureWithinChanged.)

MouseLeftButtonDown MouseLeftButtonUp.

209

MouseMove.
, , ,
RenderTransform LayoutTransform.


WPF , ,
, Tablet PC. (
.)
,
, MouseDown, MouseMove MouseUp.
,
Tablet PC.
,
, System.
Windows.Input.StylusDevice. .
StylusDevice MouseEventArgs
. ( ,
null.)
System.Win
dows.Input.Stylus
CurrentStylusDevice
. ( , null.)
, .
,
.

FAQ
, ,
. - ?
,
( ,
):
.

,
.
, ,
. ,
, ,
, Windows7 WPF3.5
SP1.

210 6. : , ,

StylusDevice
StylusDevice , :
Inverted , ,
( ).
InAir , , .
,
,
.
StylusButtons StylusButton. ,
. StylusBut
ton Name Guid,
StylusButtonState, : Up Down.
TabletDevice System.Win
dows.Input.TabletDevice,

(,
). Type Stylus Touch
.
StylusDevice GetPosition, ,
. GetStylus
Points, StylusPoint.
StylusPoint :
X ,
.
Y ,
.
PressureFactor 0 1, ,
. ,
(
). ,
PressureFactor 0.5.
GetStylusPoints (
), , - .
, MouseMove
.

:
StylusEnter StylusLeave
StylusMove PreviewStylusMove
StylusInAirMove PreviewStylusInAirMove
StylusDown, StylusUp, PreviewStylusDown PreviewStylusUp

211

StylusButtonDown, StylusButtonUp, PreviewStylusButtonDown Preview


StylusBut

tonUp
StylusSystemGesture PreviewStylusSystemGesture
StylusInRange, StylusOutOfRange, PreviewStylusInRange PreviewStylusOutOfRange
GotStylusCapture LostStylusCapture

StylusEventArgs,
StylusDevice StylusDevice.
InAir, Inverted, GetPosition GetStylusPoints,
StylusDevice.

StylusEventArgs:
StylusDownEventArgs StylusDown Pre
view
StylusDown; TapCount,
ClickCount .
StylusButtonEventArgs StylusButtonDown,
StylusButtonUp Preview-; StylusButton,
.
StylusSystemGestureEventArgs Stylus
Sys
temGesture PreviewStylusSystemGesture; SystemGesture,
SystemGesture
: Tap, RightTap, TwoFingerTap, Drag, RightDrag, Flick, HoldEnter,
HoldLeave, HoverEnter, HoverLeave, None.

WPF Stroke (),


, StylusPoints,
InkPresenter, Stroke.
InkCanvas,
11 , ,
InkPresenter. InkCanvas
, ,
.
!


Windows 7 ,
, ,
WPF4. :
.
, ,
, .

212 6. : , ,
,
, .

( )
, Multi
Point Mouse SDK (http://microsoft.com/multipoint/mouse-sdk),
25 !
. MultiPoint
;
http://blogs.msdn.com/ansont/archive/2010/01/30/custom-touch-devices.aspx.


:
TouchEnter TouchLeave
TouchMove PreviewTouchMove
TouchDown, TouchUp, PreviewTouchDown PreviewTouchUp
GotTouchCapture LostTouchCapture
,
. ,
.
TouchEventArgs,
:
GetTouchPoint , TouchPoint.
, ,
. GetPosition .
GetIntermediateTouchPoints ,
TouchPoint , ,
. GetStylus
Points .
TouchDevice , TouchDevice.
TouchPoint Position, Size,
, ,
Bounds, . ,
, ,
, TouchDevice
Action, : Down, Move, Up
( TouchAction).
TouchDevice,
Id. (

213

TouchDevice)
.
6.6 TouchDown, TouchMove TouchUp
( !)
.
, Canvas canvas:
<Window x:Class="TouchEvents.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Touch Events">
<Canvas Name="canvas">
<Canvas.Background>
<LinearGradientBrush>
<GradientStop Color="Black"/>
<GradientStop Color="Red" Offset="1"/>
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</Window>

.6.2.

.6.2.

6.6. MainWindow.xaml.cs TouchDown,


TouchMove TouchUp
using System;
using System.Collections.Generic;
using System.Windows;

214 6. : , ,
using
using
using
using

System.Windows.Controls;
System.Windows.Input;
System.Windows.Media;
System.Windows.Media.Imaging;

namespace TouchEvents
{
public partial class MainWindow : Window
{
// TouchDevice
Dictionary<TouchDevice, Image> fingerprints =
new Dictionary<TouchDevice, Image>();
public MainWindow()
{
InitializeComponent();
}
protected override void OnTouchDown(TouchEventArgs e)
{
base.OnTouchDown(e);
//
canvas.CaptureTouch(e.TouchDevice);
//
Image fingerprint = new Image { Source = new BitmapImage(
new Uri("pack://application:,,,/fingerprint.png")) };
//
TouchPoint point = e.GetTouchPoint(canvas);
fingerprint.RenderTransform = new TranslateTransform(
point.Position.X, point.Position.Y);
//
fingerprints[e.TouchDevice] = fingerprint;
canvas.Children.Add(fingerprint);
}
protected override void OnTouchMove(TouchEventArgs e)
{
base.OnTouchMove(e);
if (e.TouchDevice.Captured == canvas)
{
//
Image fingerprint = fingerprints[e.TouchDevice];
TranslateTransform transform =
fingerprint.RenderTransform as TranslateTransform;
//
TouchPoint point = e.GetTouchPoint(canvas);
transform.X = point.Position.X;

215

transform.Y = point.Position.Y;
}
}
protected override void OnTouchUp(TouchEventArgs e)
{
base.OnTouchUp(e);
//
canvas.ReleaseTouchCapture(e.TouchDevice);
//
canvas.Children.Remove(fingerprints[e.TouchDevice]);
fingerprints.Remove(e.TouchDevice);
}
}
}


, ,
TouchDown, TouchUp.
,
OnXXX Window.
OnTouchDown ,
. , ,
,
. Canvas .
Image ,
12 ,
TranslateTransform,
, .
TouchDevice.
OnTouchMove ,
TouchDevice, TouchPoint. ,
TouchDevice, .
OnTouchUp ,
Image .

Silverlight 4 . ,
WPF, Silver
light, FrameReported,
. FrameReported
System.Windows.Input.Touch TouchPoint
. ; ,
, .

216 6. : , ,
.

, .

, ,

,
. ,
TranslateTransform, RotateTransform Scale
Transform . ,
, .
, ,
, ,
, ,
.
,
, .
, WPF
, ,
. :
ManipulationStarting ManipulationStarted
ManipulationDelta
ManipulationCompleted
, ,

. , IsManipu
lationEnabled true
.


TouchDown,
ManipulationStarting, ManipulationStarted.
TouchMove ManipulationDelta, ,
, ManipulationCompleted. ManipulationStarting
ManipulationStarted
,
.
ManipulationDelta
, ;
.
ManipulationDelta:
Translation Vector, X Y
Scale Vector

217

Rotation double,
Expansion Vector, Scale

; ,
,

, ManipulationDeltaEventArgs,
ManipulationDelta, ManipulationDelta:
DeltaManipulation ( ,
) CumulativeManipulation (
, ManipulationStarted). ,
, ,
!
6.7 Window.
,
: ,
.
<Window x:Class="ManipulationEvents.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Manipulation Events">
<Canvas Name="canvas" IsManipulationEnabled="True">
<Image Name="photo" Source="photo.jpg">
<Image.RenderTransform>
<MatrixTransform/>
</Image.RenderTransform>
</Image>
</Canvas>
</Window>

.6.3.

.6.3. ,
ManipulationDelta

218 6. : , ,
6.7. MainWindow.xaml.cs ManipulationDelta
,
using
using
using
using

System;
System.Windows;
System.Windows.Input;
System.Windows.Media;

namespace ManipulationEvents
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
canvas.ManipulationDelta += Canvas_ManipulationDelta;
}
void Canvas_ManipulationDelta(object sender,
ManipulationDeltaEventArgs e)
{
MatrixTransform transform = photo.RenderTransform as MatrixTransform;
if (transform != null)
{
// ,
// MatrixTransform
Matrix matrix = transform.Matrix;
matrix.Translate(e.DeltaManipulation.Translation.X,
e.DeltaManipulation.Translation.Y);
matrix.RotateAt(e.DeltaManipulation.Rotation,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
matrix.ScaleAt(e.DeltaManipulation.Scale.X,
e.DeltaManipulation.Scale.Y,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
transform.Matrix = matrix;
e.Handled = true;
}
}
}
}

Image photo
MatrixTransform, RenderTransform,
ManipulationDelta Matrix ,
ManipulationDeltaEventArgs. RotateAt ScaleAt
(e.Manipulation
Origin).

. , IsManipulationEnab
led=True; XAML-
Canvas, Image.

219

, Manipula
tionStarting ManipulationStartingEventArgs.Manipulation
Container .



, ,
.

, , ,
.
, ManipulationInertia
Starting . Manipu
lationInertiaStarting ManipulationCompleted
, .
ManipulationInertiaStarting ,
, - ManipulationIner
tiaStartingEventArgs.TranslationBehavior, ManipulationInertiaStartingEventArgs.
RotationBehavior ManipulationInertiaStartingEventArgs.ExpansionBehavior.
ManipulationDelta (
ManipulationDeltaEventArgs.IsInertial true) ,
,
ManipulationCompleted. ( Manipu
lationInertiaStarting , ManipulationCompleted
.)
,
, :
TranslationBehavior DesiredDisplacement, DesiredDeceleration, InitialVelocity
RotationBehavior DesiredRotation, DesiredDeceleration, InitialVelocity
ExpansionBehavior DesiredExpansion, DesiredDeceleration, InitialRadius, Ini
tialVelocity
DesiredDeceleration (
) DesiredDispla
cement ( ), DesiredRotation ( )
DesiredExpansion ( ).
,
. InitialVelocity InitialRadius
, .
ManipulationInertiaStarting,
ManipulationInertiaStartingEventArgs.InitialVelocities,
LinearVelocity, AngularVelocity ExpansionVelocity.
6.8 6.7 ,
.

220 6. : , ,
6.8. MainWindow.xaml.cs ManipulationDelta
ManipulationInertiaStarting ,

using
using
using
using

System;
System.Windows;
System.Windows.Input;
System.Windows.Media;

namespace ManipulationEvents
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
canvas.ManipulationDelta += Canvas_ManipulationDelta;
canvas.ManipulationInertiaStarting += Canvas_ManipulationInertiaStarting;
}
void Canvas_ManipulationInertiaStarting(object sender,
ManipulationInertiaStartingEventArgs e)
{
e.TranslationBehavior.DesiredDeceleration = 0.01;
e.RotationBehavior.DesiredDeceleration = 0.01;
e.ExpansionBehavior.DesiredDeceleration = 0.01;
}
void Canvas_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
MatrixTransform transform = photo.RenderTransform as MatrixTransform;
if (transform != null)
{
// ,
// MatrixTransform
Matrix matrix = transform.Matrix;
matrix.Translate(e.DeltaManipulation.Translation.X,
e.DeltaManipulation.Translation.Y);
matrix.RotateAt(e.DeltaManipulation.Rotation,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
matrix.ScaleAt(e.DeltaManipulation.Scale.X,
e.DeltaManipulation.Scale.Y,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
transform.Matrix = matrix;
e.Handled = true;
}
}
}
}

, ,
. Manipu

221

lationBoundaryFeedback, ,
,
.

WPF , -
, ,
iPhone. ,
ManipulationDelta ReportBoundaryFeedback
ManipulationDeltaEventArgs. Manipula
tionBoundaryFeedback, Window,
.

FAQ
ManipulationDeltaEventArgs Complete Cancel.
?
Complete ( , ).
Cancel ,
,
, , .

6.9
, .6.4.
Window:
<Window x:Class="SpinThePrizeWheel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Spin the Prize Wheel">
<Window.Background>
<LinearGradientBrush>
<GradientStop Color="White"/>
<GradientStop Color="Orange" Offset="1"/>
</LinearGradientBrush>
</Window.Background>
<Grid Name="grid" IsManipulationEnabled="True">
<Image Name="prizeWheel" RenderTransformOrigin="0.5,0.5"
Source="prizeWheel.png" Margin="0 30 0 0">
<Image.RenderTransform>
<RotateTransform/>
</Image.RenderTransform>
</Image>
<Image Source="arrow.png" VerticalAlignment="Top" Stretch="None"/>
</Grid>
</Window>

222 6. : , ,

.6.4. -
,

6.9. MainWindow.xaml.cs
using
using
using
using

System;
System.Windows;
System.Windows.Input;
System.Windows.Media;

namespace SpinThePrizeWheel
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
grid.ManipulationStarting += Grid_ManipulationStarting;
grid.ManipulationDelta += Grid_ManipulationDelta;
grid.ManipulationInertiaStarting += Grid_ManipulationInertiaStarting;
grid.ManipulationCompleted += Grid_ManipulationCompleted;
}
void Grid_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
//
e.Mode = ManipulationModes.Rotate;
}
void Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
(prizeWheel.RenderTransform as RotateTransform).Angle +=
e.DeltaManipulation.Rotation;
}

223

void Grid_ManipulationInertiaStarting(object sender,


ManipulationInertiaStartingEventArgs e)
{
e.RotationBehavior.DesiredDeceleration = 0.001;
}
void Grid_ManipulationCompleted(object sender,
ManipulationCompletedEventArgs e)
{
// . ,
// !
}
}
}

6.9 ManipulationStarting ,
. ,
ManipulationDelta
, (
). ManipulationDelta
RotateTransform, Angle e.DeltaManipulation.Rotation. Angle
e.CumulativeManipulation.Rotation,
0, .
ManipulationInertiaStarting
,
. , ManipulationCompleted

.

ScrollViewer
PanningMode HorizontalOnly, VerticalOnly,
HorizontalFirst, VerticalFirst Both. ScrollViewer
PanningDeceleration PanningRatio.

TranslateTransform.
PanningMode None,
WPF ScrollViewer ,

.

224 6. : , ,

Surface Toolkit for Windows


Touch WPF Microsoft
Surface,
.
(, SurfaceButton SurfaceCheckBox),
(, ScatterView LibraryStack).

,
WPF ,
.
(, ListBoxItem
), ,
.
Cut (), Copy () Paste ().
:
MenuItem Menu, MenuItem ContextMenu, Button
ToolBar, ..
, Cut, Copy Paste,
. ,

( Click
Button, KeyDown Window ..). ,
,
(,
, ).
,
,
.
, WPF ,
.
(
)
, . ,
WPF; ,
Microsoft Foundation Class Library (MFC),
. , MFC,
WPF .
:
WPF .

225

(,

).
WPF


, ICommand (
System.Windows.Input),
:
Execute ,
CanExecute , true, ,
false,
CanExecuteChanged ,
CanExecute
Cut, Copy Paste, :
, ICommand; ,
( , );
Execute ( Can
Execute true) CanExecuteChanged
IsEnabled
. , .
, , Button, CheckBox MenuItem,
,
. Command ( ICom
mand). ,
Execute ( CanExecute true) ,
Click. , IsEnabled
, CanExecute,
CanExecuteChanged.
,
XAML.
. WPF ,
ICommand , Cut,
Copy Paste, , .
WPF
:
ApplicationCommands Close, Copy, Cut, Delete, Find, Help, New, Open, Paste, Print,
PrintPreview, Properties, Redo, Replace, Save, SaveAs, SelectAll, Stop, Undo .
ComponentCommands MoveDown, MoveLeft, MoveRight, MoveUp, ScrollByLine, Scroll
PageDown, ScrollPageLeft, ScrollPageRight, ScrollPageUp, SelectToEnd, SelectTo
Home, SelectToPageDown, SelectToPageUp .

226 6. : , ,
MediaCommands ChannelDown, ChannelUp, DecreaseVolume, FastForward, Increase

Volume, MuteVolume, NextTrack, Pause, Play, PreviousTrack, Record, Rewind, Select,


Stop .
NavigationCommands BrowseBack, BrowseForward, BrowseHome, BrowseStop, Favori
tes, FirstPage, GoToPage, LastPage, NextPage, PreviousPage, Refresh, Search, Zoom
.
EditingCommands AlignCenter, AlignJustify, AlignLeft, AlignRight, Correct
Spel
lingError, DecreaseFontSize, DecreaseIndentation, EnterLineBreak, EnterParagraph
Break, IgnoreSpellingError, IncreaseFontSize, IncreaseIndentation, MoveDownBy
Line, MoveDownByPage, MoveDownByParagraph, MoveLeftByCharacter, MoveLeftByWord,
MoveRightByCharacter, MoveRightByWord .
- ,
ICommand, RoutedUICommand,
ICommand,
.
About,
, Help (). ,

Help,
ApplicationCommands. , helpBut
ton, Help C#
:
helpButton.Command = ApplicationCommands.Help;

RoutedUICommand Text,
. (
RoutedUICommand
RoutedCommand.) , Help Text
Help ( ). ,
Content, :
helpButton.Content = ApplicationCommands.Help.Text;

Text RoutedUICommand
, WPF! , ,
Content ApplicationCommands.Help.Text,
,
. ,
, (, ),
, , .
,
- . Text
.

227

About , ,
. , ,
,
. .
CommandBinding
, ,
( ). ,
UIElement (ContentElement), CommandBin
dings, CommandBinding. Com
mandBinding Help Window
About. :
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Help,
HelpExecuted, HelpCanExecute));

, HelpExecuted HelpCanExecute.
,
CanExecute Execute Help.
6.10 6.11 About,
Help Help,
XAML ( -
).
6.10. About Help
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AboutDialog"
Title="About WPF Unleashed" SizeToContent="WidthAndHeight"
Background="OrangeRed">
<Window.CommandBindings>
<CommandBinding Command="Help"
CanExecute="HelpCanExecute" Executed="HelpExecuted"/>
</Window.CommandBindings>
<StackPanel>
<Label FontWeight="Bold" FontSize="20" Foreground="White">
WPF 4 Unleashed
</Label>
<Label> 2010 SAMS Publishing</Label>
<Label>Installed Chapters:</Label>
<ListBox>
<ListBoxItem>Chapter 1</ListBoxItem>
<ListBoxItem>Chapter 2</ListBoxItem>
</ListBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button MinWidth="75" Margin="10" Command="Help" Content=
"{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button MinWidth="75" Margin="10">OK</Button>
</StackPanel>
<StatusBar>You have successfully registered this product.</StatusBar>

228 6. : , ,
</StackPanel>
</Window>

6.11. 6.10
using System.Windows;
using System.Windows.Input;
public partial class AboutDialog : Window
{
public AboutDialog()
{
InitializeComponent();
}
void HelpCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
{
System.Diagnostics.Process.Start("http://www.adamnathan.net/wpf");
}
}

CommandBinding Window XAML,


,
. Content Button
Text ( XAML)
,
13. ,
Help - . CommandConverter
, Command
Help,
{x:Static ApplicationCommands.Help}. (
.) HelpCanExecute
, , HelpExecuted
-, URL- .


Help About
Click. ,
, :
.
, F1.
About 6.10 F1
Help, Help! ,
Help

229

, .
, InputBindings
KeyBinding / MouseBinding. (
.) , F2
Help,
AboutDialog:
this.InputBindings.Add(
new KeyBinding(ApplicationCommands.Help, new KeyGesture(Key.F2)));

Help : F1 F2.
F1,
NotACommand:
this.InputBindings.Add(
new KeyBinding(ApplicationCommands.NotACommand, new KeyGesture(Key.F1)));

XAML-
:
<Window.InputBindings>
<KeyBinding Command="Help" Key="F2"/>
<KeyBinding Command="NotACommand" Key="F1"/>
</Window.InputBindings>



WPF
, ,
. TextBox,
Cut, Copy Paste ,
Undo Redo. , TextBox
Ctrl+X, Ctrl+C, Ctrl+V, Ctrl+Z Ctrl+Y,
.

XAML-:
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Orientation="Horizontal" Height="25">
<Button Command="Cut" CommandTarget="{Binding ElementName=textBox}"
Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button Command="Copy" CommandTarget="{Binding ElementName=textBox}"
Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button Command="Paste" CommandTarget="{Binding ElementName=textBox}"
Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button Command="Undo" CommandTarget="{Binding ElementName=textBox}"
Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>
<Button Command="Redo" CommandTarget="{Binding ElementName=textBox}"
Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"/>

230 6. : , ,
<TextBox x:Name="textBox" Width="200"/>
</StackPanel> 6

XAML
.xaml Internet Explorer
.
Content ,
Text .
CommandTarget TextBox (
, x:Reference,
WPF). TextBox, Button,
, TextBox .
XAML- , .6.5.
,
TextBox , ,
. Paste
,
, .

.6.5. , ,
TextBox

Button TextBox ,
.
WPF .
, (
) ,
.

WPF
, .
.NET,

.
, UIElement,
ContentElement (.
11) UIElement3D (. 16 ).

Windows
Windows
-
XAML-
XAML-


7.


WPF .
. -
WPF-. WPF
Windows,
, -,
,
, .
-
( ), ,
, Photo Gallery (),
Windows Live Photo Gallery.
, .

Windows
Windows .
. .7.1
Photo Gallery.
WPF Application Visual Studio
.
.NET, AssemblyInfo.*, Resources.*, Settings.*. WPF
App.xaml MainWindow.xaml (
). Application Window,
. ( Vi
sual Studio MainWindow.xaml Window1.xaml.)

232

7.

.7.1. Photo Gallery

Window
Window ,
. WPF Window
Win32. WPF- Win32-
: ,
.. ( (Chrome)
, Minimize (),
Maximize () Close ().)
, Window Win32 ( ,
Form Windows Forms), .
Window,
Show, Hide ( , Visibility
Hidden Collapsed) Close.
, Window Control, Win32 ,
, , .
Window , Icon,
Title ( ) Windowstyle.
Left Top.
, WindowstartupLocation
CenterScreen CenterOwner. ,
, . ,
Topmost true,
, ShowInTaskbar false,
.
Window .
, Window,
Show.
. ,
, , ,

Windows

233

.
.
,
Owner ( Window) , ,
.
OwnedWindows.
, (, -
, ),
Activated Deactivated Window.
, Activate ( ,
SetForegroundWindow Win32 API).
, ShowAc
tivated false.
7.1 MainWindow Photo
Gallery.
7.1. MainWindow.xaml.cs,

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
if (MessageBox.Show("Are you sure you want to close Photo Gallery?",
"Annoying Prompt", MessageBoxButton.YesNo, MessageBoxImage.Question)
== MessageBoxResult.No)
e.Cancel = true;
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
//
...
}
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
//
...

234

7.

}
...
void exitMenu_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
...
}

MainWindow InitializeComponent,
Window, XAML-.
Closing, Closed Initialized.
OnEventName,
.
OnEventName, , WPF
. ,
, .
.NET Framework ,
.

InitializeComponent!
2 XAML
: InitializeComponent ,
XAML-,
. ,
XAML- . , Visual Studio
InitializeComponent,
.

Closing ,
, Close,
Alt+F4 ..
, true Cancel
CancelEventArgs ( Windows
Forms). OnClosing
, No, .
,
.
,
. ,
Closed ( ).
7.1 Closed ,
. , MainWindow
Initialized

Windows

235

. (
, .)
File
Exit, .

Application
,
. , ,
MainWindow, 7.1, Main:
public static void Main()
{
MainWindow window = new MainWindow();
window.Show();
}

. -, WPF (STA). ,
Main STAThread.
Show , (
ShowWindow Win32 API) .
Show Main, ,
. MainWindow
!

FAQ
?!
- COM!
, COM. ,
Win32 (
Windows Forms), WPF ,
.
, WPF (. 19
).
STA

WPF. STA-,
.
WPF , (, Dispat
cherObject) . ,
. ,
, (
). WPF

, .

236

7.

COM
, . Main STAThread
!

Main MainWindow,
,
MainWindow, ,
. ,
Win32: WM_PAINT, WM_MOUSEMOVE .. WPF
, Windows. Win32
,

. WPF System.Windows.
Application.

Application.Run
Application Run,
. Main
:
[STAThread]
public static void Main()
{
Application app = new Application();
MainWindow window = new MainWindow();
window.Show();
app.Run(window);
}

, Application StartupUri,
, :
[STAThread]
public static void Main()
{
Application app = new Application();
app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
app.Run();
}

Main ,
MainWindow Show App
lication. : -, MainWindow
XAML-
(URI), -,
Run, Window. URI-
WPF 12 .

Windows

237

StartupUri
XAML. Visual Studio
WPF Application Application
App XAML- StartupUri
Window. Photo Gallery App.xaml
:
<Application x:Class="PhotoGallery.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"/>

StartupUri
Uri.
App.xaml.cs
InitializeComponent:
using System.Windows;
namespace PhotoGallery
{
public partial class App : Application
{
public App()
{
InitializeComponent();
}
}
}


WPF- . , ,
Application,
.

FAQ
WPF- Main?
, Visual Studio WPF Application,
Main, ! ,
Main, , ,
.
App.xaml , Visual
Studio ApplicationDefinition.
Main. Photo Gallery
App.g.cs:

238

7.

[System.STAThreadAttribute()]
public static void Main() {
PhotoGallery.App app = new PhotoGallery.App();
app.InitializeComponent();
app.Run();
}

Visual Studio App.g.cs.


(Solution Explorer),
(Show All Files).

FAQ
WPF- ?

, Main, WPF-
Main .
. -, Application
XAML-, Main
.
System.Environment.GetCommandLineArgs,
, Main.
(
, - ) ,
Application
ApplicationDefinition, Page.
Main. , ,
Application Run
, App.g.cs.

Application
Application .
,
. ,
Application (, App, Visual Studio)
OnEventName,
Startup Exit, Activated Deactivated ( ,
Window, ,
), SessionEnding ,
, .

, ReasonSessionEnding.

Windows

239

, Application
Windows,
. ,
MainWindow.
, ,
.

Windows!
Window Application.Windows ,
, .

. , , Win
dows[2] !

( Run Application
), .
ShutdownMode
ShutdownMode. ,
, ( MainWin
dow), .
, Shutdown,
. ,
Windows (,
Windows).
Application - Properties.
ASP.NET, ,
( /
), .
Application
, Properties.
, Photo Gallery
:
myApplication.Properties["CurrentPhotoFilename"] = filename;

:
string filename = myApplication.Properties["CurrentPhotoFilename"] as string;

, , Object,
.

240

7.

Window,
,
Application. ,
Application.Current. , myApplication
Application.Current:
Application.Current.Properties["CurrentPhotoFilename"] = filename;

FAQ
WPF
(MDI)?
WPF MDI-,
Windows Forms. WPF-
, ,
(. 19). ! MDI-

, Aero Snap Windows 7 Flip 3D
Windows Vista. ,
( MDI),
WPF .

FAQ
WPF ,
?
WPF- :
( ) .
, C#:
bool mutexIsNew;
using (System.Threading.Mutex m =
new System.Threading.Mutex(true, uniqueName, out mutexIsNew))
{
if (mutexIsNew)
// , .
else
// . !
}

, uniqueName
!
(GUID) . ,

!

Windows

241

,
. .NET Framework
Microsoft.VisualBasic.ApplicationServices. WindowsFormsApp
licationBase, , ,
, WPF-. :
RPC-,
.


Application
Application
WPF-, .
Application,
, ,
.
Win32, WPF
Dispatcher System.Windows.Thre
ading, ,
Win32 API.
, Main Application.
Run, Dispatcher.Run. ( Application.Run Dispatcher.
Run !) -
. , Dispatcher.Run
, - Dispatcher.ExitAll
Frames (, Closed).



WPF-
. (
, .
,
.) ,
DispatcherObject
, . (
, Freezable.)
, WPF ,

. DispatcherObject Dispatcher ( Dispatcher).

Invoke ( ) BeginInvoke ( ).
,

242

7.

. Invoke
BeginInvoke Dispat
cherPriority, 10 , Send (
) SystemIdle (,
).

, Dispatcher.Run .
, ,
. ,
, ,
, . ,
Application,
. , Application.Windows
, , Application.


,

(
). WPF
.
,
.
, PNG-
, (,
GIF-) .
, WPF, ,
WPF. (
,
!) Office 2010,
, .
, .
Visual Studio 2010,
Add New Item ( ) Splash Screen
(WPF). ( Visual Studio 2008 SP1 http://
codeplex.com.) ,
SplashScreen;
. ! .7.2
Photo Gallery.

SplashScreen.
Visual Studio 2008 SP1 ,
. , ,

Windows

243


,
System.Windows.SplashScreen.
, .

.7.2. Photo Gallery


PNG-


Windows ( ),
,
, , .
. (
, ,
, .)


WPF
,
. , WPF
, Win32 API. ,

, .

, ShowDialog,

244

7.

. , Photo Gallery
PrintDialog :
void printMenu_Click(object sender, RoutedEventArgs e)
{
string filename = (pictureBox.SelectedItem as ListBoxItem).Tag as string;
Image image = new Image();
image.Source = new BitmapImage(new Uri(filename, UriKind.RelativeOrAbsolute));
PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() == true) // true, false null
pd.PrintVisual(image, Path.GetFileName(filename) + " from Photo Gallery");
}

,
, Windows.

Windows, , , - ,
, Win
dows . ,
Windows7 : ;
, (Home
Group); ,
;
. , ,

, Windows7.

Windows Forms, WPF ,


Windows. WPF
. ( Windows Forms
ColorDialog, FontDialog FolderBrowser, WPF
.) ,
, System.Windows.Forms.dll
, Windows Forms.


, ,
,
,
(Rename Photo) Photo Gallery (.7.3).
WPF ,
Window. Window,
.

Windows

245

.7.3.

Window ( )
, ShowDialog Show.
Show, ShowDialog (
, )
null ( bool? C#). Photo Gallery
RenameDialog:
void renameMenu_Click(object sender, RoutedEventArgs e)
{
string filename = (pictureBox.SelectedItem as ListBoxItem).Tag as string;
RenameDialog dialog = new RenameDialog(
Path.GetFileNameWithoutExtension(filename));
if (dialog.ShowDialog() == true) // true,
// false null
{
//
try
{
File.Move(filename, Path.Combine(Path.GetDirectoryName(filename),
dialog.NewFilename) + Path.GetExtension(filename));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Cannot Rename File", MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
}

,
( RenameDialog), , ShowDialog
true, , ,
, false .
, DialogResult
( bool?). DialogResult
. , OK
RenameDialog :
void okButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}

246

7.

IsDefault true,
.


ShowDialog
,
, ShowDialog Window,
, Dispatcher.Run , Application.Run.
, WPF-
Application, :
[STAThread]
public static void Main()
{
MainWindow window = new MainWindow();
window.ShowDialog();
}


Windows
(
), ,
.
: .NET Framework.
,
, , Silver
light- XAML- (
).
Photo Gallery

, 7.2.
7.2. MainWindow.xaml.cs,

protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
// ,
IsolatedStorageFile f = IsolatedStorageFile.GetUserStoreForAssembly();
using (IsolatedStorageFileStream stream =
new IsolatedStorageFileStream("myFile", FileMode.Create, f))
using (StreamWriter writer = new StreamWriter(stream))
{
foreach (TreeViewItem item in favoritesItem.Items)

Windows

247

writer.WriteLine(item.Tag as string);
}
}
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
//
IsolatedStorageFile f = IsolatedStorageFile.GetUserStoreForAssembly();
using (IsolatedStorageFileStream stream =
new IsolatedStorageFileStream("myFile", FileMode.OpenOrCreate, f))
using (StreamReader reader = new StreamReader(stream))
{
string line = reader.ReadLine();
while (line != null)
{
AddFavorite(line);
line = reader.ReadLine();
}
}
...
}

IsolatedStorageFile IsolatedStorageFileStream
System.IO.IsolatedStorage. ,
, Documents
() .


, Visual Studio Settings (
Properties\Settings.settings).

.

: ClickOnce
Windows
Windows, ,
, ,
Program Files ( , ),
,
, ,
. WPF-,

248

7.

Windows. Visual Studio


Setup and Deployment ( ).
, ClickOnce
( .NET Framework 2.0).
, Windows. Visual
Studio ClickOnce ,
BuildPublish ( ). Visual
Studio, Windows SDK,
ClickOnce: mage.exe
mageUI.exe.
, Windows
ClickOnce:
,


( )
,

COM-
( ,
)
CD/DVD
, ClickOnce
Windows:

.
: -,
URL-
( ),
,
.
,
,
.
,
(,
- -
).
.NET
, ,
.

Windows

249

, ClickOnce ,
, , ,
. ,
, ,
. , COM-
COM .

Windows
-,
Windows,
Windows, Windows Media Player , , Windows
Live Photo Gallery, Photo.
Photo Gallery, .7.1,

. WPF
.
,
, .
,
,
,
.
,
, -. ,
,
URI,
.
, , .

Photo Gallery,
.
, ..
, Navigation
Window Page.


WPF
Page. (Page , , Window.)
Page
: NavigationWindow Frame.

250

7.

, ,
, .

FAQ
NavigationWindow Frame?
: Navigati
onWindow , , Frame
HTML- FRAME IFRAME. NavigationWindow ,
Frame ( )
. Frame NavigationWindow
Frame. NavigationWindow
/, ,
ShowsNavigationUI,
Page. , NavigationWindow
ShowsNavigationUI, Frame NavigationUIVisibility,
Page.

Photo Gallery StartupUri


Application NavigationWindow:
<NavigationWindow x:Class="PhotoGallery.Container"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Photo Gallery" Source="MainPage.xaml">
</NavigationWindow>

MainPage.xaml,
NavigationWindow, Page, ,
MainWindow.xaml:
<Page x:Class="PhotoGallery.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Photo Gallery" Loaded="Page_Loaded">
... ...
</Page>

MainPage.xaml.cs
, MainWindow.xaml.cs.
MainPage.xaml.cs , ,
OnClosing OnClosed, ,
Page (
).
.7.4 , NavigationWindow Page Photo
Gallery
(). , ,

Windows

251

.7.4. NavigationWindow,

,
. Photo Gallery
,
, NavigationWindow. ,
Click NavigationWindow.GoBack,
Click NavigationWindow.GoForward.

WPF Page,
HTML- ( ,
)! WPF- HTML-
. , .

Page
NavigationService,
,
NavigationWindow Frame. NavigationService,
NavigationService.GetNavigationService,
Page. ,
NavigationService Page. ,
, ,
:
this.NavigationService.Title = "Main Photo Gallery Page";

252

7.

, :
this.NavigationService.Refresh();

Page ,
, WindowHeight, WindowWidth Win
dowTitle. , XAML Page.


,
( ), , (
-), .
:
Navigate
( Hyperlink)

Navigate
Navigate,
. ,
, URI:
//
PhotoPage nextPage = new PhotoPage();
this.NavigationService.Navigate(nextPage);
// URI
this.NavigationService.Navigate(new Uri("PhotoPage.xaml", UriKind.Relative));

Page, URI, XAML . (, URI WPF,


12.) XAML-
Page.


Navigate
,
Navigate. Page,
Content:
this.NavigationService.Content = nextPage;

URI , Source:
this.NavigationService.Source = new Uri("PhotoPage.xaml", UriKind.Relative);

,
Navigate .

Windows

253

HTML-,
Navigate, URI. :
this.NavigationService.Navigate(new Uri("http://www.adamnathan.net/wpf"));

Hyperlink
WPF Hyperlink,
HTML. Hyperlink
TextBlock , HTML- A,
,
. Na
vigateUri Hyperlink ( href HTML). ,
XAML- , .7.5:
<TextBlock>
Click <Hyperlink NavigateUri="PhotoPage.xaml">here</Hyperlink> to view the photo.
</TextBlock>

.7.5. Hyperlink
, HTML

, Hyperlink HTML-
A. ,
WPF, HTML , .


,
Hyperlink, Hyperlink NavigateUri,
Click Navigate,
.

Hyperlink
HTML. , Frame ,
, TargetName Hyper
link .
Page ( HTML-, #),
URI # .

254

7.

FAQ
HTML- , WPF Page?
HTML ,
HREF ,
WPF Page. HTML WPF
, :
HREF -
Navigating, , Navigate
(Navigating
). HTML WPF
XAML
XAML- ( ,
Silverlight). .


,
, , .
, .7.4.

, .7.1.
7.1.


, GoBack GoForward
( CanGoBack
CanGoForward,
).
NavigationWindow , Frame
; JournalOwner
ship, :
OwnsJournal .
UsesParentJournal
, .

Windows

255

Automatic UsesParentJournal,

(NavigationWindow Frame),
OwnsJournal. .
,
. , NavigationUI
Visibility Hidden.

Page URI (,
Navigate Hyperlink)
Page, . , ,
,
(, Application.Proper
ties). ( Navigate, Page, ,
, , .)

Page,
JournalEntry.KeepAlive true.

Page ,
RemoveFromJournal true. ,
,
.

FAQ
,
?

,
.
,
StopLoading.
Refresh
. , Navigate, URI
, Navigating
NavigationMode.Refresh ,
.

256

7.



,
. ,
,
.
AddBackEntry,
CustomContentState. CustomContentState ,
, Replay.
,
. JournalEntryName,
.
Photo Gallery
, :
[Serializable]
class RotateState : CustomContentState
{
FrameworkElement element;
double rotation;
public RotateState(FrameworkElement element, double rotation)
{
this.element = element;
this.rotation = rotation;
}
public override string JournalEntryName
{
get { return "Rotate " + rotation + ""; }
}
public override void Replay(NavigationService navigationService,
NavigationMode mode)
{
//
element.LayoutTransform = new RotateTransform(rotation);
}
}


,
Navigate, Hyperlink ,
. ,

.

257

Windows

. 7.6 7.7

.

Initialized

Navigating

NavigationProgress

Loading


Initialized

Navigated

LoadCompleted

Loaded

.7.6. ,


Navigating

NavigationProgress

Loading


Unloaded

Initialized

Navigated

LoadCompleted

Loaded

.7.7. ,

NavigationProgress
Navigated. NavigationStopped.
LoadCompleted,
.

258

7.

.7.6 7.7 ,
( ).
Application,
.


HTML-!
WPF WPF
Page , WPF HTML HTML
WPF. HTML HTML
. HTML HTML
.


, , ,
- .
- HTML
URL . WPF
.


WPF , URL,
Navigate,
Object. ,
Page, Uri. -
( , , ..),
. :
int photoId = 10;
// Page
PhotoPage nextPage = new PhotoPage();
this.NavigationService.Navigate(nextPage, photoId);
// URI
this.NavigationService.Navigate(
new Uri("PhotoPage.xaml", UriKind.Relative), photoId);

,
LoadCompleted ExtraData
:
this.NavigationService.LoadCompleted += new
LoadCompletedEventHandler(container_LoadCompleted);

Windows

259

...
void container_LoadCompleted(object sender, NavigationEventArgs e)
{
if (e.ExtraData != null)
LoadPhoto((int)e.ExtraData);
}


Navigate, Page,
,
( ).
Photo Gallery :
int photoId = 10;
// Page
PhotoPage nextPage = new PhotoPage(photoId);
this.NavigationService.Navigate(nextPage);

, PhotoPage
:
public PhotoPage(int id)
{
LoadPhoto(id);
}

,
, PhotoPage ,
. !

Properties Application,
. :
// Page URI
Application.Properties["PhotoId"] = 10;
this.NavigationService.Navigate(...);


Navigate:
if (Application.Properties["PhotoId"] != null)
LoadPhoto((int)Application.Properties["PhotoId"]);

,
(
). , ,
.

PageFunction
,
, - ,

260

7.

( ,
). .
,
.
.7.8.
MainPage

SettingsPage

MainPage

.7.8. ,

. URI,
MainPage,
. ,
, ,
.
App
lication.Properties GoBack
.
, ,
( ),
, .
WPF

. .7.9.

MainPage

SettingsPage

.7.9.
PageFunction

PageFunction.
Page ( ),
.
Visual Studio PageFunction,
Page. ,
Add New Item Page Function (WPF):

261

<PageFunction
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
x:Class="MyProject.PageFunction1"
x:TypeArguments="sys:String"
Title="PageFunction1">
<Grid>
</Grid>
</PageFunction>

TypeArguments. PageFunction
( PageFunction<T>),
- .
PageFunction . -
PageFunction
, ,
.
PageFunction Page,
, :
PageFunction1 nextPage = new PageFunction1<string>();
this.NavigationService.Navigate(nextPage);


Return PageFunction:
nextPage.Return += new ReturnEventHandler<string>(nextPage_Return);
...
void nextPage_Return(object sender, ReturnEventArgs<string> e)
{
string returnValue = e.Result;
}

, ReturnEventHandler ReturnEventArgs
-. Result
, ,
PageFunction ( ).
, PageFunction, ,
ReturnEventArgs OnReturn,
PageFunction:
OnReturn(new ReturnEventArgs<string>("the data"));

-
WPF
. ,
.

262

7.

,
.
, :
1. AllowsTransparency Window true.
, .
InvalidOperationException.)
2. Windowstyle Window None,
. (
AllowsTransparency="True" Inva
lidOperationException.)
3. Background Window Transparent.
.
4. , ,
DragMove Window.
, , ,
.
5. ,

. , ShowInTaskbar
false!
XAML- .
Close:
<Window x:Class="GadgetWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300"
AllowsTransparency="True" Windowstyle="None" Background="Transparent"
MouseLeftButtonDown="Window_MouseLeftButtonDown">
<Grid>
<Ellipse Fill="Red" Opacity="0.5" Margin="20">
<Ellipse.Effect>
<DropShadowEffect/>
</Ellipse.Effect>
</Ellipse>
<Button Margin="100" Click="Button_Click">Close</Button>
</Grid>
</Window>

DropShadowEffect 15 ;
.
:
using System.Windows;
using System.Windows.Input;
public partial class GadgetWindow : Window
{

XAML-

263

public GadgetWindow()
{
InitializeComponent();
}
void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.DragMove();
}
void Button_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}

, MouseLeftButtonDown
Window.DragMove. DragMove
. .7.10 , .

.7.10. Window
()

XAML-
WPF ,
-. XAML-
(XAML Browser Applications XBAPs),
WPF- . XBAP-
, Silverlight
WPF. -
WPF-
.

264

7.

FAQ
XBAP-
?
. Silverlight, XBAP-
.NET Framework (3.0 ),
Windows Internet Explorer ( ,
ActiveX WebBrowser) Firefox (
.NET Framework 3.5 ). .NET Framework4.0
Firefox . (
3.5 .)

XBAP-
Windows ,
.NET, .
:
WPF .NET Framework.
.
-.
XAML .
, XBAP-? Visual Studio
:
1. , Visual Studio , ,
WPF Browser Application.
2. Page
.
3. .
Visual Studio, MSBuild,
(.
).


XAML-
, Visual Studio,
XBAP-. ,
:
<HostInBrowser>True</HostInBrowser>
<Install>False</Install>
<TargetZone>Internet</TargetZone>

XAML-

265

,
PresentationHost.exe, .
, ,
, ,
, , .
EXE- XML-:
.manifest ClickOnce-;
.xbap ClickOnce-
( , XBAP,
.application)
, , . XBAP- , , ClickOnce-
, , WPF
.

ClickOnce!
XBAP- ClickOnce,
, .
ClickOnce-
.
, . (
, ClickOnce ,
Documents .)
, , ,
,
! Visual Studio
(- AssemblyVersion("1.0.*") Assembly
Info), ,
.
,
, ,
mage.exe Windows SDK.
mage -cc. SDK ,
rundll32 %windir%\system32\dfshim.dll CleanOnlineAppCache


WPF-
,
XAML- . WPF-
. XBAP- ,
,

266

7.

API. ,
Photo Gallery XBAP, , , ,
( ):
// ! !
AddFavorite(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));

.NET Framework
, FileIO
Permission, . (
, ,
,
.)
, ,
, . ,
,
,
Window. ( Popup
, Page.)
, ,
,
.
. , WPF XBAP-
WebBrowser,
Firefox.


XBAP- ,
, ,
.
BrowserInteropHelper.IsBrowserHosted
System.Windows.Interop.

,
.
, ( 512
), -.

(
). Microsoft.Win32.OpenFileDialog:
string fileContents = null;
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == true) // true, false null
{

XAML-

267

using (Stream s = ofd.OpenFile())


using (StreamReader sr = new StreamReader(s))
{
fileContents = sr.ReadToEnd();
}
}

XBAP Windows
( ).
URL- HTML-,
XBAP-, URL ( )
BrowserInteropHelper.Source.
cookie ,
Application.GetCookie.

FAQ
?
, .NET:
AllowPartiallyTrustedCallers
( ,
), XBAP-
API.
, AllowPartiallyTrustedCallers
.
, -
, .
, , , .

FAQ
XBAP- ?
,
, ,
XBAP- . ,
:
1. ClickOnce- (app.manifest) Unrestric
ted="true" XML- PermissionSet, :
<PermissionSet class="System.Security.PermissionSet" version="1"
ID="Custom" SameSite="site" Unrestricted="true"/>

268

7.

2. ( .csproj .vbproj)
<TargetZone>Internet</TargetZone>

:
<TargetZone>Custom</TargetZone>

Visual Studio
Security ().
XBAP-
.
, (,
, ) .


Page XBAP- Navigation
Window. Internet Explorer 6 Firefox
. , XBAP-
. , ,

. ,
false ShowsNavigationUI Page.
, Internet Explorer 7 Navi
gationWindow ,
. ,
, WPF,
, , .

Internet Explorer 7 ( )
Page . XBAP-
HTML- IFRAME, ,
false ShowsNavigationUI WPF- Page.

XBAP- , ClickOnce. Visual


Studio ( Mage Windows SDK)
- . (-
.)

XAML-

269

XBAP- ,
, URL-,
( Internet Explorer). ,
ClickOnce-,
, , , , XBAP-
- . (,
, !)

FAQ
XBAP ,
. ?

.
Windows, Internet Explorer .NET Framework
WPF ,
XBAP, . , .NET Framework
(sandbox) , Internet Explorer.
, WPF

(, )
,
.

Silverlight, XBAP WPF-


. , Windows Media Center
Windows HTML.
XBAP- HTML-,
WPF Media Center WPF- !


ClickOnce
, ,
,
, .
XBAP-,
,
.
, Visual Studio
. ,
PublishApplication Files (
), .

270

7.

.
System.Deployment.Application ( Sys
tem.Deployment.dll) API.
7.3 ,
.
, Page1,
7.3. (
XAML- ,
.) Page1 ,
MyGroup, Page2 (
- ).
7.3. ClickOnce

using
using
using
using

System;
System.Windows.Controls;
System.Windows.Threading;
System.Deployment.Application;

public partial class Page1 : Page


{
public Page1()
{
InitializeComponent();
}
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
if (ApplicationDeployment.IsNetworkDeployed)
{
// ,
// MyGroup
ApplicationDeployment.CurrentDeployment.DownloadFileGroupCompleted +=
delegate {
// ,
// GotoPage2 BeginInvoke
Dispatcher.BeginInvoke(DispatcherPriority.Send,
new DispatcherOperationCallback(GotoPage2), null);
};
ApplicationDeployment.CurrentDeployment.DownloadFileGroupAsync("MyGroup");
}
else
{
// ClickOnce ( ,
// ), Page2
GotoPage2(null);
}
}

XAML-

271

// Page2 .
// DispatcherOperationCallback.
private object GotoPage2(object o)
{
return NavigationService.Navigate(new Uri("Page2.xaml", UriKind.Relative));
}
}

,
( ),
ApplicationDeployment.IsNetworkDeployed, ,
. ,
,
Page2. ,
DownloadFileGroupAsync.
DownloadFileGroupCompleted ,
. ApplicationDeployment
,
.

XAML-
.NET Framework 3.0 , Internet
Explorer WPF
XAML- , HTML-.
HTML XAML,
, , .. ,
: XAML-
Windows. ,
.
, XAML-

(. 13 ). .7.11
Photo Gallery XAML-.
, -,
.

,
XAML, HTML-
, XAML,
.
, ".NET
CLR 3.0". , , .
Silverlight .

272

7.

.7.11. Photo Gallery XAML-


HTML XAML,
XAML- IFRAME
HTML-.

WPF ,
Windows,
, , .
Photo Gallery, (
http://informit.com/title/9780672331190), ,

Windows, -
.

.
.NET Framework. , Win
dows Vista WPF3.0, Windows7
WPF3.5. Windows, ,
WPF4 .
,
.NET Framework.


Aero Glass
TaskDialog

8.

Windows 7

Windows ,
, Windows7 . Windows
Vista, Windows7
, .
,
.
, WPF-
Windows7 :


, Windows Vista,
Windows7:
Aero Glass
TaskDialog



Windows7 .
, ,

. .8.1 Internet Explorer.
,
, .
.8.2
Photo Gallery :
. (
, .)

274

8. Windows 7

.8.1. Internet Explorer



.8.2. ,
Photo Gallery

WPF4 System.Windows.Shell.JumpList,

XAML! ,
WPF,

.
,
JumpList.JumpList Appli
cation, JumpList.
JumpList.SetJumpList. JumpList
,
Windows Apply .
JumpList JumpItems,
: JumpTask JumpPath;
JumpItem.

275

JumpTask
, JumpTask
, Start InPrivate Browsing ( InPrivate) Open
new tab ( ) .8.1. ,
JumpTask (
). -
, , .
8.1 JumpTask
App.xaml, Photo Gallery
.
.8.3. , (,
) ,
, .
8.1. App.xaml
JumpTask
<Application x:Class="PhotoGallery.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<JumpList.JumpList>
<JumpList>
<JumpTask Title="Launch another instance"
Description="Launches another instance of this program."/>
<JumpTask Title="Task #1" Arguments="-task1"
Description="Performs task #1."/>
<JumpTask Title="Task #2" Arguments="-task2"
Description="Performs task #2."/>
</JumpList>
</JumpList.JumpList>
</Application>

.8.3. JumpTask

JumpTask Title ,
, Description,

276

8. Windows 7

. , Jump
Task Photo Gallery.
, ,
. JumpTask
Photo Gallery
,
- . Photo Gallery
Environment.CommandLine .

,
, -
. ,
,
( ),
, .

,
,
. .8.4 , , 8.1,
.

.8.4.
, .8.3

277

Visual Studio !
Visual Studio
vshost32.exe, .8.5. ,
, (
vshost32.exe, ).
JumpPath, ,
. , Enable the Visual Studio
hosting process ( Visual Studio) Debug ()
.

.8.5. Visual Studio


!
,
. , ,
, .
, ,
, .

JumpTask
JumpTask
, .
8.2, .8.6 .

278

8. Windows 7

8.2. App.xaml
JumpTask
<Application x:Class="PhotoGallery.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<JumpList.JumpList>
<JumpList>
<JumpTask Title="Magnifier"
Description="Open the Windows Magnifier."
ApplicationPath="%WINDIR%\system32\magnify.exe"/>
<JumpTask Title="Calculator"
Description="Open the Windows Calculator."
ApplicationPath="%WINDIR%\system32\calc.exe"
IconResourcePath="%WINDIR%\system32\calc.exe"/>
<JumpTask Title="Notepad"
Description="Open Notepad."
ApplicationPath="%WINDIR%\system32\notepad.exe"
IconResourcePath="%WINDIR%\system32\notepad.exe"
WorkingDirectory="%HOMEDRIVE%%HOMEPATH%"/>
<JumpTask Title="Internet Explorer (No Add-Ons)"
Description="Start without ActiveX controls or extensions."
ApplicationPath="%PROGRAMFILES%\Internet Explorer\iexplore.exe"
IconResourcePath="%PROGRAMFILES%\Internet Explorer\iexplore.exe"
WorkingDirectory="%HOMEDRIVE%%HOMEPATH%"
IconResourceIndex="6" Arguments="-extoff"/>
</JumpList>
</JumpList.JumpList>
</Application>

.8.6. JumpTask

JumpTask , .
ApplicationPath

279

magnify.exe. , ApplicationPath
, XAML,
.
JumpTask IconResourcePath,
. Win32, EXE-
DLL-. ( .ico,
, ,
XAML- .) EXE-,
.
IconResourcePath null, JumpTask,
- .
JumpTask Photo Gallery.

%WINDIR%\System32\shell32.dll %WINDIR%\System32\imageres.dll
,
JumpTask. , Windows ,
.

JumpTask WorkingDirectory,
( ). ,
ApplicationPath IconResourcePath,
.
JumpTask Arguments,
Internet Explorer ,
IconResourceIndex . .8.6
,
e. EXE- DLL-
. IconResourceIndex , 0,
(, Windows).
EXE- DLL- ,
, IconResourceIndex, .
, , .8.5.

JumpTask
, IconResourceIndex -1.
, IconResourcePath .

280

8. Windows 7

JumpTask ,
JumpTask,
. .8.7 , , <JumpTask/>
8.2.

.8.7.
JumpTask


CustomCategory
JumpTask, JumpItem. ,
,
Tasks ().
8.3 One
Two. .8.8.
8.3. App.xaml CustomCategory
<Application x:Class="PhotoGallery.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<JumpList.JumpList>
<JumpList>
<JumpTask Title="Magnifier" CustomCategory="One"
Description="Open the Windows Magnifier."
ApplicationPath="%WINDIR%\system32\magnify.exe"/>
<JumpTask Title="Calculator" CustomCategory="Two"
Description="Open the Windows Calculator."

281

ApplicationPath="%WINDIR%\system32\calc.exe"
IconResourcePath="%WINDIR%\system32\calc.exe"/>
<JumpTask Title="Notepad" CustomCategory="Two"
Description="Open Notepad."
ApplicationPath="%WINDIR%\system32\notepad.exe"
IconResourcePath="%WINDIR%\system32\notepad.exe"
WorkingDirectory="%HOMEDRIVE%%HOMEPATH%"/>
<JumpTask Title="Internet Explorer (No Add-Ons)"
Description="Start without ActiveX controls or extensions."
ApplicationPath="%PROGRAMFILES%\Internet Explorer\iexplore.exe"
IconResourcePath="%PROGRAMFILES%\Internet Explorer\iexplore.exe"
WorkingDirectory="%HOMEDRIVE%%HOMEPATH%"
IconResourceIndex="6" Arguments="-extoff"/>
</JumpList>
</JumpList.JumpList>
</Application>

.8.8.

JumpTask , Arguments!
- Windows7 .
, .
, .
, ,
, ,
.

, ,
(
).

282

8. Windows 7

Pinned ().
, .8.9.

.8.9. JumpTask

!
JumpTask, ,
JumpItems. JumpTask
, ! Two
.8.8 8.9 One.

JumpPath
JumpTask , JumpPath ,
- .
JumpPath,
Windows .
,
JPG- (
, Windows,
(Open WithChoose
Default Program).
8.4 8.3
JumpTask JumpPath (
, JumpItem).
C:
JPG-, ,

283

.8.10.
, , .8.8.
8.4. App.xaml JumpPath 8.3
<Application x:Class="PhotoGallery.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<JumpList.JumpList>
<JumpList>
<JumpPath Path="C:\Users\Adam\Pictures\DSC06397.jpg"
CustomCategory="Photos"/>
<JumpTask Title="Magnifier" CustomCategory="One"
Description="Open the Windows Magnifier."
ApplicationPath="%WINDIR%\system32\magnify.exe"/>
...
</JumpList>
</JumpList.JumpList>
</Application>

.8.10. Photos JumpPath

JumpPath Tasks,
. ,
CustomCategory ( JumpItem).
,
.
DSC06397.jpg,
-,
Path. ,
, JumpPath 8.4
JumpTask:

284

8. Windows 7

<JumpTask Title="DSC06397.jpg"
Arguments="C:\Users\Adam\Pictures\DSC06397.jpg"
Description="DSC06397 (C:\Users\Adam\My Pictures)"
CustomCategory="Photos"/>


, ,
, JumpTask.

Path JumpPath
!
8.4 JPG- . ,
, .
JumpPath ,
(
).

JumpPath


JumpPath. ,
:
.
,
ShowRecentCategory / ShowFrequentCategory
JumpList true.
. Windows ,
(File Open)
(
, Windows
JumpPath).
-
(, ,
), JumpList.AddToRecentCategory.
, ,
JumpPath JumpTask. AddToFrequentCate
gory; ,
.
8.4
, .8.11.
<JumpList ShowFrequentCategory="True" ShowRecentCategory="True">
<JumpPath Path="C:\Users\Adam\Pictures\DSC06397.jpg"

285

CustomCategory="Photos"/>
<JumpTask Title="Magnifier" CustomCategory="One"
Description="Open the Windows Magnifier."
ApplicationPath="%WINDIR%\system32\magnify.exe"/>
...
</JumpList>

.8.11. Recent Frequent

,
- , . .8.1,
Internet Explorer
(Frequent),
(Recent). (Windows7 Recent
, .)




, Windows
JumpPath JumpItems ,
.
, JumpItemsRejected JumpList.
JumpItemsRejected
, JumpList,

286

8. Windows 7

.
JumpList, XAML-,
XAML. JumpList ,
Apply.
JumpItemsRejectedEventArgs, ,
JumpItem,
JumpItemRejectionReason, :
NoRegisteredHandler
.
InvalidItem ( Windows,
Windows7).
RemovedByUser .
None .
, ,
JumpItemsRemovedByUser,
JumpItem. ,
, , , -
JumpTask.
.


JumpItemsRejected
JumpItemsRemovedByUser
,
JumpList.Apply, , WPF
Shell Win32 API. Windows Shell

, .
(, WPF) . Win
dows , ;
, . , Windows
, ,
,
.
Apply JumpList ,
JumpTask JumpPath,
. ,
, ,
. Apply WPF
JumpList , .
( ) Apply, WPF
,
.

287


WPF4 Window TaskbarItemInfo (
System.Windows.Shell.TaskbarItemInfo),
. ,
,
Description TaskbarItemInfo :
<Window ...>
<Window.TaskbarItemInfo>
<TaskbarItemInfo Description="Custom tooltip"/>
</Window.TaskbarItemInfo>
...
</Window>

C#:
public MainWindow()
{
...
this.TaskbarItemInfo = new TaskbarItemInfo();
this.TaskbarItemInfo.Description = "Custom tooltip";
}

.8.12 . , TaskbarItemInfo
.

.8.12. ,
TaskbarItemInfo.Description



. ,
, .
Windows, Internet Explorer.
, .

288

8. Windows 7

,
TaskbarItemInfo: ProgressValue ProgressState. ProgressValue
double 0 (0%) 1 (100%),
. ProgressState
, TaskbarItemProgressState:
Normal .
Paused .
Error .
Indeterminate ,
, Progress
Value.
None . .

, . ,
, . ,
. ,
, ProgressState Paused.
Indeterminate ProgressState ,
, .
ProgressValue ,
.
ProgressState ProgressValue ,
. .8.13
ProgressState , ProgressValue
.85.
Paused
Normal

Indeterminate
Error
None

.8.13. ProgressState,
,


,

. TaskbarItemInfo
Overlay ImageSource (
).
.8.14 , :

289

<Window ...>
<Window.TaskbarItemInfo>
<TaskbarItemInfo Overlay="overlay.png"/>
</Window.TaskbarItemInfo>
...
</Window>
overlay.png

.8.14.

,
, .
, Taskbar
ItemInfo , Windows,
Windows7.
.
Overlay null,
.

Overlay
.
!


,
,
. TaskbarItemInfo
. ThumbnailClipMargin ( Thickness),
.
.8.15 .
Photo Gallery ThumbnailClipMargin
( )

.

290

8. Windows 7

.8.15. ,



, TaskbarItemInfo,
, Windows Media Player:
/, , .
ThumbButtonInfos ThumbButtonInfo.
ThumbButtonInfo WPF UIElement,
, .
, ImageSource.
ThumbButtonInfo ImageSource, ,
Description, , Click. (
, Button, Click .)
, ThumbButtonInfo Command
CommandTarget CommandParameter,
.
ThumbButtonInfo Visibility,
. ( ,
, WPF .)
: IsEnabled, IsInteractive, IsBackgroundVisible DismissWhenClicked;
, , true. (background),
IsBackgroundVisible,
, .
.8.16
Photo Gallery:
<Window ...>
<Window.TaskbarItemInfo>

291

<TaskbarItemInfo>
<TaskbarItemInfo.ThumbButtonInfos>
<ThumbButtonInfo Description="Previous" Click="..."
ImageSource="Images\previousSmall.gif"/>
<ThumbButtonInfo Description="Slideshow" Click="..."
ImageSource="Images\slideshowSmall.gif"/>
<ThumbButtonInfo Description="Next" Click="..."
ImageSource="Images\nextSmall.gif"/>
<ThumbButtonInfo Description="Undo" Click="..."
ImageSource="Images\counterclockwiseSmall.gif"/>
<ThumbButtonInfo Description="Redo" Click="..."
ImageSource="Images\clockwiseSmall.gif"/>
<ThumbButtonInfo Description="Delete" Click="..."
ImageSource="Images\deleteSmall.gif"/>
</TaskbarItemInfo.ThumbButtonInfos>
</TaskbarItemInfo>
</Window.TaskbarItemInfo>
...
</Window>

.8.16.

ThumbButtonInfo!
,
ThumbButtonInfos .
,
Visibility Collapsed (
). ,
, ,
,
Visibility.

292

8. Windows 7

FAQ

?
. Windows
.

Aero Glass
Aero Glass , ,
. Win
dows Vista. WPF-,
DwmExtendFrameIntoClientArea Win32 API. ( Dwm
Desktop Window Manager.) Window
( .8.17)
,
( .8.18).
WPF-,
.

.8.17. Window

Aero Glass

293

.8.18.

Visual C++ DwmExtendFrameIntoClientArea


. C# Visual Basic
PInvoke ( DllImport). PInvoke
C# API Desktop Window Manager.
8.5 PInvoke ,
PInvoke.
8.5. Aero Glass C#
[StructLayout(LayoutKind.Sequential)]
public struct MARGINS
{
public MARGINS(Thickness t)
{
Left = (int)t.Left;
Right = (int)t.Right;
Top = (int)t.Top;
Bottom = (int)t.Bottom;
}
public int Left;
public int Right;
public int Top;
public int Bottom;
}
public class GlassHelper
{

294

8. Windows 7

[DllImport("dwmapi.dll", PreserveSig=false)]
static extern void DwmExtendFrameIntoClientArea(
IntPtr hWnd, ref MARGINS pMarInset);
[DllImport("dwmapi.dll", PreserveSig=false)]
static extern bool DwmIsCompositionEnabled();
public static bool ExtendGlassFrame(Window window, Thickness margin)
{
if (!DwmIsCompositionEnabled())
return false;
IntPtr hwnd = new WindowInteropHelper(window).Handle;
if (hwnd == IntPtr.Zero)
throw new InvalidOperationException(
"The Window must be shown before extending glass.");
// WPF, Win32
window.Background = Brushes.Transparent;
HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor =
Colors.Transparent;
MARGINS margins = new MARGINS(margin);
DwmExtendFrameIntoClientArea(hwnd, ref margins);
return true;
}
}

GlassHelper.ExtendGlassFrame Window
Thickness; ,
,
. ( ,
1.) ,
( Aero Glass),
Thickness MARGINS,
DwmExtendFrameIntoClientArea, ,
HWND. Background Window
Transparent, .
. 19
.
WPF- Window GlassHelper.Extend
GlassFrame :
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
// SourceInitialized:
GlassHelper.ExtendGlassFrame(this, new Thickness(-1));
// ,
// ,

Aero Glass

295

IntPtr hwnd = new WindowInteropHelper(this).Handle;


HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam,
IntPtr lParam, ref bool handled)
{
if (msg == WM_DWMCOMPOSITIONCHANGED)
{
// :
GlassHelper.ExtendGlassFrame(this, new Thickness(-1));
handled = true;
}
return IntPtr.Zero;
}
private const int WM_DWMCOMPOSITIONCHANGED = 0x031E;

,
, ,
.
, Remote Desktop (
).
, Win32 WM_DWMCOMPOSI
TIONCHANGED. ,
19.
.8.19 Photo
Gallery.

.8.19. Photo Gallery

296

8. Windows 7

TaskDialog
MessageBox ,
.
, Windows Vista ,
MessageBox TaskDialog, .
Windows

.
,
TaskDialog Win32 API. Aero Glass,
PInvoke. 8.6
PInvoke TaskDialog .
8.6. TaskDialog C#
[DllImport("comctl32.dll", PreserveSig=false, CharSet=CharSet.Unicode)]
static extern TaskDialogResult TaskDialog(IntPtr hwndParent, IntPtr hInstance,
string title, string mainInstruction,string content,
TaskDialogButtons buttons, TaskDialogIcon icon);
enum TaskDialogResult
{
Ok=1,
Cancel=2,
Retry=4,
Yes=6,
No=7,
Close=8
}
[Flags]
enum TaskDialogButtons
{
Ok = 0x0001,
Yes = 0x0002,
No = 0x0004,
Cancel = 0x0008,
Retry = 0x0010,
Close = 0x0020
}
enum TaskDialogIcon
{
Warning = 65535,
Error = 65534,
Information = 65533,
Shield = 65532
}

TaskDialog

297

MessageBox, TaskDialog
, . ,
. .8.20 8.21
MessageBox TaskDialog,
:
// MessageBox
result = MessageBox.Show("Are you sure you want to delete '" + filename + "'?",
"Delete Picture", MessageBoxButton.YesNo, MessageBoxImage.Warning);
// TaskDialog
result = TaskDialog(new System.Windows.Interop.WindowInteropHelper(this).Handle,
IntPtr.Zero, "Delete Picture",
"Are you sure you want to delete '" + filename + "'?",
"This will delete the picture permanently, rather than sending it
to the Recycle Bin.",
TaskDialogButtons.Yes | TaskDialogButtons.No,
TaskDialogIcon.Warning);

.8.20. MessageBox Windows7


.8.21. TaskDialog

298

8. Windows 7

TaskDialog 6 Windows Common


Controls DLL (ComCtl32.dll)!
.
6 ,
(
[YourAppName].exe.manifest), :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86" name="YourAppName" type="win32" />
<description>Your description</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32" name="Microsoft.Windows.Common-Controls"
version="6.0.0.0" processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
</assembly>

Win32
( RT_MANIFEST ID, 1),
. Visual Studio,
.

, TaskDialog
"Unable to find an entry point named 'TaskDialog' in DLL
'comctl32.dll'". ,
TaskDialog.
Win32, MessageBox,
.

TaskDialog
TaskDialogIndirect. Windows SDK
Win32 .NET.
PInvoke Win32 API
http://pinvoke.net.

299


, Windows 7,
, Windows Vista. , WPF
XAML
.NET- . ,
Windows Vista, PInvoke,
Win32 API.
,
.
Windows7,
WPF. ,
Win32 API Windows7 (Windows Vista).
,
,
Windows API Code Pack http://code.msdn.micro
soft.com/WindowsAPICodePack. ,
Windows7 Windows Vista
.
,
.

WPF4,
Windows7,
WPF Shell Integration Library,
http://code.msdn.microsoft.com/WPFShell.
.NET Framework 3.5
System.Windows.Shell WPF4. API
(, 3.5 Taskbar
ItemInfo , ),

WPF.

, Win
dows, , ,
(, ,
).

300

8. Windows 7


System.Windows.Shell WPF
Windows. Windows Vista,
, JumpList, TaskbarItemInfo .,
, .
PInvoke,
Windows
. .NET
System.Environment.OSVersion. :
if (System.Environment.OSVersion.Version.Major >= 6)
// Windows Vista , TaskDialog
else
// Windows Vista, MessageBox

Windows7 6.1, Windows Vis


ta 6.0.

III
III.

9
10
11 ,

9.


,
. Win
dows Presentation Foundation .
.
,
.
,
WPF Aero, Windows7 Windows Vista.
WPF ,
. , WPF DLL- ,
Windows:
Aero ( Windows7 Windows Vista)
Luna ( Windows XP)
Royale ( Windows XP Media Center Edition 2005 Win
dows XP Tablet PC Edition 2005)
Classic ( Windows2000 )
.9.1 WPF
Windows. WPF ,
Zune, Microsoft 2006, Classic.
Aero

Luna

Royale

.9.1. WPF

Classic

304

9.

. ,

( )
, 14 , ,
.
WPF
, :
( )
(10
)
(11 ,
)
(11)
,
, .
, System.Windows.Controls.ContentControl,
Content Object, (
Button, 2
XAML).

, , ,
. .
Content, ContentControl
HasContent. false, Content null, true
.
:


FAQ
ContentControl HasContent?
Content==null , HasContent==false!
WPF API, ,
.NET API! C# HasContent .
XAML . ,
,
, HasContent true.

305

Window, 7
,
. Content -
Panel, Grid,
.


Content
Content , ,
, , ,
, Hashtable TimeZone. :
, UIElement,
OnRender . ,
(. 13 ),
.
ToString -
TextBlock.

, ,
. WPF Button, .9.1,
.
, ,
( , WPF) .
, ,
.
ButtonBase, .
ButtonBase Click ,
. Windows,

Enter , .
ButtonBase IsPressed ,
- ,
( ,
).
ButtonBase ClickMode.
, ClickMode,
, Click.
: Release ( ), Press Hover. ClickMode

306

9.

,
,
- . ,
, .


Click
Click, ButtonBase
, MouseLeftButtonDown MouseLeftButtonUp. Click
Mode Release Press,
, ButtonBase, ButtonBase
MouseButtonEventArgs.Handled true. Hover
MouseEnter MouseLeave.
,
ButtonBase, Preview- (PreviewMou
seLeftButtonDown, PreviewMouseLeftButtonUp ..),
Add
Handler, .

ButtonBase
, .
Button
RepeatButton
ToggleButton
CheckBox
RadioButton
ButtonBase ,

, Calendar DataGrid.

Button
Button WPF , ButtonBase,
: .
. ,
( Window, ShowDialog),
Button.IsCancel true,
DialogResult false.
Button.IsDefault true, Enter
, .

307

FAQ
IsDefault IsDefaulted Button?
IsDefault ,
. , IsDefaulted
( ) .
, ,
Enter . , IsDe
faulted true : IsDefault
true , TextBox
( AcceptsReturn false).
Enter , TextBox.

FAQ
?
Button, WPF,
System.Windows.Automation.Peers,
: ButtonAutomationPeer.
myButton :
ButtonAutomationPeer bap = new ButtonAutomationPeer(myButton);
IInvokeProvider iip = bap.GetPattern(PatternInterface.Invoke)
as IInvokeProvider;
iip.Invoke(); //

,

.

RepeatButton
RepeatButton , Button,
Click , . ( ,
,
ButtonBase.) Click
Delay Interval, SystemParameters.KeyboardDelay
SystemParameters.KeyboardSpeed . RepeatButton
, Button (. .9.1).
RepeatButton ,
( ) ,
. ,
,

308

9.

. :
( WPF),
, , RepeatButton
. RepeatButton Sys
tem.Windows.Controls.Primitives, , ,
, .

ToggleButton
ToggleButton ,
(
). IsChecked
true, false. ToggleButton
, Button RepeatButton.
ToggleButton IsThreeState; true,
IsChecked : true, false null.
IsChecked Nullable<Boolean> (bool?
C#). IsChe
cked true, null, false ..
, , Preview , IsChecked
, OnToggle
ToggleButton, .
IsChecked, ToggleButton
IsChecked: Checked true, Unchecked false
Indeterminate null. ,
IsCheckedChanged, , ,
.
RepeatButton, ToggleButton System.
Windows.Controls.Primitives, WPF ,
.
ToolBar,
10.

CheckBox
CheckBox, . 9.2,
. ,
? - ,
CheckBox WPF:
,
( ).

.
: .

309

,
.
? , CheckBox ,
ToggleButton ! CheckBox
ToggleButton ,
, .9.2.

.9.2. WPF CheckBox


CheckBox
CheckBox ,
ToggleButton,
Win32. CheckBox , (+)
, () ! , ,
IsThreeState false.

RadioButton
RadioButton , ToggleButton.
.
RadioButton ,
.
- RadioButton
.
-
RadioButton, ; .
, RadioButton
, . . 9.3
RadioButton.
RadioButton (IsThree
State=true IsChecked=null) ,
;
. RadioButton
, -
, .

310

9.

.9.3. WPF RadioButton

RadioButton
. ,
, .
, :
<StackPanel>
<RadioButton>Option 1</RadioButton>
<RadioButton>Option 2</RadioButton>
<RadioButton>Option 3</RadioButton>
</StackPanel>


.
- ,
GroupName,
. GroupName
( , ).
, ,
:
<StackPanel>
<StackPanel>
<RadioButton GroupName="A">Option 1</RadioButton>
<RadioButton GroupName="A">Option 2</RadioButton>
</StackPanel>
<StackPanel>
<RadioButton GroupName="A">Option 3</RadioButton>
</StackPanel>
</StackPanel>

:
<StackPanel>
<RadioButton
<RadioButton
<RadioButton
<RadioButton
</StackPanel>

GroupName="A">Option 1</RadioButton>
GroupName="A">Option 2</RadioButton>
GroupName="B">A Different Option 1</RadioButton>
GroupName="B">A Different Option 2</RadioButton>

, -
, , ,
!

311


WPF ,
, , .
. :
Label
ToolTip
Frame

Label
Label () , ,
, . ,
WPF, Content
Button, Menu ..,
- .
WPF ,
TextBlock.
. ,

Alt . ,
,
. ( Windows
), .
,
Target ( UIElement).

, Label Button,
, ,
, _Open Save_As. (Win32 Windows Forms
[&],
XML.) ,
, , __Open Save __As.


TextBox. , XAML-
TextBox Alt+U:
<Label Target="userNameBox">_User Name:</Label>
<TextBox x:Name="userNameBox"/>

Target
NameReferenceConverter, 2. C#

312

9.

TextBox (,
userNameLabel):
userNameLabel.Target = userNameBox;

ToolTip
ToolTip ( )
, ,
, ,
. .9.4
ToolTip,
XAML-:
<Button>
OK
<Button.ToolTip>
<ToolTip>
Clicking this will submit your request.
</ToolTip>
</Button.ToolTip>
</Button>

ToolTip UIElement
. ToolTip (
FrameworkElement FrameworkContentElement).

.9.4. WPF ToolTip

ToolTip , ToolTip
! Object,
, ToolTip, ToolTip
.
XAML-, .9.4, :
<Button>
OK
<Button.ToolTip>
Clicking this will submit your request.
</Button.ToolTip>
</Button>

:
<Button Content="OK" ToolTip="Clicking this will submit your request."/>

313

WPF ToolTip
! 9.1 ,
(ScreenTip) Microsoft Office.
.9.5.
9.1.
Microsoft Office ScreenTip
<CheckBox>
CheckBox
<CheckBox.ToolTip>
<StackPanel>
<Label FontWeight="Bold" Background="Blue" Foreground="White">
The CheckBox
</Label>
<TextBlock Padding="10" TextWrapping="WrapWithOverflow" Width="200">
CheckBox is a familiar control. But in WPF, it's not much
more than a ToggleButton styled differently!
</TextBlock>
<Line Stroke="Black" StrokeThickness="1" X2="200"/>
<StackPanel Orientation="Horizontal">
<Image Margin="2" Source="help.gif"/>
<Label FontWeight="Bold">Press F1 for more help.</Label>
</StackPanel>
</StackPanel>
</CheckBox.ToolTip>
</CheckBox>

.9.5. WPF
Microsoft Office

ToolTip ,
, -
.
ToolTip Open Closed ,
- .
, : ,
, ,
. , ToolTip

314

9.

, , .
ToolTipService.
ToolTipService ,
, ToolTip (
ToolTip).
ToolTip ( ,
), . , ShowDuration
, ,
, Initial
ShowDelay
. , ToolTip,
ShowDuration :
<Button ToolTipService.ShowDuration="3000">
...
</Button>

FAQ
,
?
ShowOnDisabled
ToolTipService.
XAML :
<Button ToolTipService.ShowOnDisabled="True">
...
</Button>

C# ,
:
ToolTipService.SetShowOnDisabled(myButton, true);

FAQ
?
false IsOpen.

Frame
Frame ,
.
.

315

, (
WPF) .
Frame WPF HTML-.
HTML, Frame
, WPF-, HTML-
. Frame Source System.Uri,
HTML ( XAML). :
<Frame Source="http://www.adamnathan.net"/>

Frame -
NavigationFailed,
, NavigationFailedEventArgs.Handled
true. (, WebExcep
tion) . NavigationFailedEventArgs,
,
.

7 , Frame
,
HTML-, XAML-. Frame
ActiveX Microsoft Web Browser
WPF WebBrowser.

Frame WPF WebBrowser (


WPF3.5 SP1) HTML.
HTML-,
Stream, HTML DOM
. , Silverlight-
WPF-: URL, XAP- Silver
light. , WebBrowser ;
WPF
.

, Frame HTML-,
,
WPF (- , HTML
Win32). , HTML- WPF-
, ,
Opacity .. Frame
HTML;

316

9.

URL- . ,
HTML-, WPF
WebBrowser.


Content Frame
Frame Content,
XAML. ,
Frame XAML . Con
tent :
<Frame>
<Frame.Content>
...
</Frame.Content>
</Frame>

Frame ContentProper
tyAttribute, [ContentProperty("Content")]
ContentControl. ?
WPF, ,
Content Frame,
Source,
. , Frame
,
NavigationWindow, 7. ,
Source Content, Content.



(
, ..).
,
.
ContentControl, HeaderedContentControl
Header Object.

GroupBox
GroupBox
. .9.6 GroupBox,
CheckBox. XAML-:
<GroupBox Header="Grammar">
<StackPanel>

317

<CheckBox>Check grammar as you type</CheckBox>


<CheckBox>Hide grammatical errors in this document</CheckBox>
<CheckBox>Check grammar with spelling</CheckBox>
</StackPanel>
</GroupBox>

.9.6. WPF GroupBox

, GroupBox ,
,
. GroupBox
- ,
. , StackPanel.
Content, Header ,
, UIElement,
. , Header Button (. ),
, .9.7:
<GroupBox>
<GroupBox.Header>
<Button>Grammar</Button>
</GroupBox.Header>
<StackPanel>
<CheckBox>Check grammar as you type</CheckBox>
<CheckBox>Hide grammatical errors in this document</CheckBox>
<CheckBox>Check grammar with spelling</CheckBox>
</StackPanel>
</GroupBox>

.9.7. GroupBox Button


WPF

.9.7 .
, ..

318

9.

Expander
Expander ,
,

, Windows Forms! Expander GroupBox,
,
( ).
.9.8 Expander.
, .9.6,
GroupBox Expander:
<Expander Header="Grammar">
<StackPanel>
<CheckBox>Check grammar as you type</CheckBox>
<CheckBox>Hide grammatical errors in this document</CheckBox>
<CheckBox>Check grammar with spelling</CheckBox>
</StackPanel>
</Expander>

.9.8. WPF Expander

Expander IsExpanded Expanded/Collapsed.


, (Up, Down, Left,
Right) ExpandDirection.
Expander Togg
leButton . Expander,
, Togg
leButton RepeatButton.

! WPF Button,
,
, .
, ,
, ,
(items controls).

10.

10

, WPF
,
,
- .
ItemsControl, , ContentControl,
Control.
ItemsControl Items ( ItemCollec
tion). ,
,
. , UIElement
, ( )
TextBlock, ,
ToString.
ListBox
.
ListBoxItem, :
<ListBox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Button>Button</Button>
<Expander Header="Expander"/>
<sys:DateTime>1/1/2012</sys:DateTime>
<sys:DateTime>1/2/2012</sys:DateTime>
<sys:DateTime>1/3/2012</sys:DateTime>
</ListBox>

( sys:DateTime x:DateTime,
,
XAML-.)

320

10.

Items,
Items . ,
.10.1. UIElement (Button Expander)
. DateTime
, ToString.

.10.1. ListBox,

2 XAML , Items
. ,
, , Items
. ItemsControl
ItemsSource,
.
ItemsSource 13
.

,
.
:
(, -)
.
13.


Items ItemsSource, ItemsControl
, :
HasItems ,
XAML-.
C#
Items.Count.
IsGrouping , .
, , ,
.

321

ItemsCollection,
.
13.
AlternationCount AlternationIndex
-
. , AlternationCount 2,
,
. 14 ,
, .
DisplayMemberPath ;
( ),
.
ItemsPanel ,
,
.

.

DisplayMemberPath
. 10.2 , ,
ListBox DisplayMemberPath:
<ListBox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
DisplayMemberPath="DayOfWeek">
<Button>Button</Button>
<Expander Header="Expander"/>
<sys:DateTime>1/1/2012</sys:DateTime>
<sys:DateTime>1/2/2012</sys:DateTime>
<sys:DateTime>1/3/2012</sys:DateTime>
</ListBox>

.10.2. ListBox, .10.1,


DisplayMemberPath, DayOfWeek

DisplayMemberPath DayOfWeek, WPF ,


DayOfWeek ( ). - .10.2
DateTime Sunday, Monday Tuesday. (

322

10.

ToString DayOfWeek
DayOfWeek.) Button Expander DayOfWeek,
TextBlock.


WPF
DisplayMemberPath
, WPF ,
. ,
,
.
,
, (..),
, C#.
.
, , , FirstButton
Button, Content
"OK". ("OK")
:
FirstButton.Content

(2):
FirstButton.Content.Length

('O'):
FirstButton.Content[0]

C#,
.

ItemsPanel
WPF,
,
, .
WPF ,
,
,
. -,
(items panel), ,
, .
,
5 (
, Panel). , ListBox
, XAML-

323

WrapPanel, Photo
Gallery 7 :
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>

XAML- ,
, C#:
FrameworkElementFactory panelFactory = new
FrameworkElementFactory(typeof(WrapPanel));
myListBox.ItemsPanel = new ItemsPanelTemplate(panelFactory);

FanCanvas,
21 :
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<custom:FanCanvas/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>

. 10.3
Photo Gallery ( ListBox Viewbox)
, .
, ListBox ,
.

.10.3. ListBox FanCanvas ItemsPanel

324

10.

FAQ
ListBox ,
?
ListBox VirtualizingStackPanel,
.
, VirtualizingStackPanel, Orien
tation Horizontal:
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>


ItemsPanel Virtuali
zingStackPanel. WPF4 ,
, .
VirtualizingStackPanel.
VirtualizationMode Recycling.
() ,
, .


, ListBox, ItemsPre
senter, ItemsPanel:
<ControlTemplate TargetType="{x:Type ListBox}">
<Border ...>
<ScrollViewer Padding="{TemplateBinding Padding}" Focusable="false">
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</ScrollViewer>
</Border>
<ControlTemplate.Triggers>
...
</ControlTemplate.Triggers>
</ControlTemplate>

ScrollViewer ,
. ,
,
ScrollViewer.

325


ListBox
:
ScrollViewer.HorizontalScrollBarVisibility Auto
ScrollViewer.VerticalScrollBarVisibility Auto
ScrollViewer.CanContentScroll true
ScrollViewer.IsDeferredScrollingEnabled false

CanContentScroll true, ,
false .
, .
IsDeferredScrollingEnabled false,
. true,
ScrollViewer
, .

, IsDeferredScrollingEnabled true

. , Microsoft Outlook
.
ListBox,
, ScrollViewer
:
<ListBox
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.CanContentScroll="False"
ScrollViewer.IsDeferredScrollingEnabled="True"
>
...
</ListBox>

ListBox , .
,
: , .

,
.
Selector, ItemsControl, ,
. ,
:

326

10.

SelectedIndex ,

, -1, .
.
SelectedItem .
SelectedValue .
, SelectedValue , SelectedItem.
SelectedValuePath
,
(SelectedValuePath DisplayMemberPath).
,
, .
Selector ,
:
IsSelected ,
( , ).
IsSelectionActive ,
, .
Selector SelectionChanged,
. 6
: , ,
ListBox,
.
WPF , Selector:
ComboBox
ListBox
ListView
TabControl
DataGrid
.

ComboBox
.10.4 ComboBox
. , .
, ,
.
, , Alt+
, Alt+ F4.
ComboBox DropDownOpened DropDownClosed
IsDropDownOpen.
. , ComboBox
DropDownOpened. ,

327

IsDropDownOpen ,
.

.10.4. WPF ComboBox


ComboBox ,
. -
,
. ,
Text ComboBox,
.
IsEditable IsReadOnly,
false. , StaysOpenOnEdit;
true, ,
( Microsoft Office
Win32).
,
. , ComboBox
( ,
). ,
ComboBox, .
10.1 XAML- ComboBox,
. Power
Point, Microsoft Office,
. Office
,
. .10.5
10.1, , ,
IsEditable true.
10.1. ComboBox ,
Microsoft Office
<ComboBox>
<!-- #1 -->
<StackPanel Orientation="Horizontal" Margin="5">
<Image Source="CurtainCall.bmp"/>
<StackPanel Width="200">
<TextBlock Margin="5,0" FontSize="14" FontWeight="Bold"

328

10.

VerticalAlignment="center">Curtain Call</TextBlock>
<TextBlock Margin="5" VerticalAlignment="center"
TextWrapping="Wrap">
Whimsical, with a red curtain background that represents
a stage.
</TextBlock>
</StackPanel>
</StackPanel>
<!-- #2 -->
<StackPanel Orientation="Horizontal" Margin="5">
<Image Source="Fireworks.bmp"/>
<StackPanel Width="200">
<TextBlock Margin="5,0" FontSize="14" FontWeight="Bold"
VerticalAlignment="center">Fireworks</TextBlock>
<TextBlock Margin="5" VerticalAlignment="center"
TextWrapping="Wrap">
Sleek, with a black sky containing fireworks. When you need
to celebrate PowerPoint-style, this design is for you!
</TextBlock>
</StackPanel>
</StackPanel>
... ...
</ComboBox>
IsEditable=False ( )

IsEditable=True

.10.5. IsEditable true


, ToString

, "System.Windows.Controls.Stack
Panel" , TextSearch.
, ,
.

329

FAQ
IsEditable IsReadOnly
ComboBox?
IsEditable true, ComboBox .
IsReadOnly , ,
, IsReadOnly TextBox. , IsReadOnly
, IsEditable true, , IsEditable
true, , . .10.1
ComboBox
.

10.1. ComboBox
IsEditable IsReadOnly
IsEditable

IsReadOnly

false

false


,
( )

false

true

true

false

true

true

ComboBox TextSearch.TextPath
, ( )
. , DisplayMemberPath Selected
ValuePath;
.
10.1
TextBlock,
("Curtain Call" "Fireworks"). TextBlock
StackPanel,
StackPanel (
), TextBlock ( StackPanel).
, TextPath 10.1
:
<ComboBox IsEditable="True" TextSearch.TextPath="Children[1].Children[0].Text">
...
</ComboBox>

330

10.


, .
; , TextPath,
.
TextSearch Text;
, ComboBox.
Text ,
. 10.1
:
<ComboBox IsEditable="True">
<!-- #1 -->
<StackPanel TextSearch.Text="Curtain Call" Orientation="Horizontal" Margin="5">
...
</StackPanel>
<!-- #2 -->
<StackPanel TextSearch.Text="Fireworks" Orientation="Horizontal" Margin="5">
...
</StackPanel>
... ...
</ComboBox>

TextSearch.TextPath ComboBox
, TextSearch.Text . Text
Path , Text
, .
.10.6 TextSearch.
TextPath TextSearch.Text.

.10.6. TextSearch
, Office

331

TextSearch, IsTextSearch
Enabled ItemsControl false. IsTextSearchCaseSensitive,
ItemsControl ( false),
,
.

FAQ

SelectionChanged?
SelectionChanged ,
, ComboBox,
, .
SelectionChangedEventArgs
IList: AddedItems RemovedItems. AddedItems
, RemovedItems
. ,
:
void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
object newSelection = e.AddedItems[0];
}

, -
( )!
ComboBox ,
, IsEditable true, IsReadOnly false.
,
, SelectionChanged ,
AddedItems .

ComboBoxItem
ComboBox
ComboBoxItem. ( , ,
, .)
(, ComboBoxItem
). 10.1 :
<!-- #1 -->
<ComboBoxItem TextSearch.Text="Curtain Call">
<StackPanel Orientation="Horizontal" Margin="5">
...
</StackPanel>

332

10.

</ComboBoxItem>
<!-- #2 -->
<ComboBoxItem TextSearch.Text="Fireworks">
<StackPanel Orientation="Horizontal" Margin="5">
...
</StackPanel>
</ComboBoxItem>
... ...

, TextSearch.Text
ComboBoxItem, StackPanel
.
TextSearch.TextPath, Content.Children[1].Children[0].Text.

FAQ
ComboBoxItem?
ComboBoxItem IsSelected IsHighlighted
Selected Unselected. ComboBoxItem

( IsEditable false): ComboBox
,
, Content.
ComboBoxItem ( ),
, .
ComboBoxItem ,
ComboBox ( ,
TextBlock Label). :
<ComboBox>
<ComboBoxItem>Item 1</ComboBoxItem>
<ComboBoxItem>Item 2</ComboBoxItem>
</ComboBox>

ListBox
ListBox ComboBox,
, (
, ). . 10.7
ListBox, , 10.1.
, ListBox ,
. Selecti
onMode, (
SelectionMode):
Single , Com
boBox. .

333

.10.7. WPF ListBox


Multiple .

SelectedItems,
.
Extended ,
.
,
Shift ( ) Ctrl
( , ).
ListBox Win32.
ComboBox ComboBoxItem, ListBox
ListBoxItem. .
ComboBoxItem ListBoxItem,
IsSelected Selected Unselected.


ListBox
ListBox SelectedItems,
SelectionMode,
Selector SelectedIndex, SelectedItem SelectedValue,
.
, SelectedItem
SelectedItems ( ,
), SelectedIndex SelectedValue
. , ,
, . ,
ListBox SelectedIndices SelectedValues.

334

10.

TextSearch,
ComboBox, ListBox. ,
.10.7 TextSearch.Text,
F , ListBox ,
Fireworks. TextSearch ,
S , S
System.Windows.Controls.StackPanel. (
!)

FAQ
ListBox?
ListBox .
,
. ,
, ,
false ScrollViewer.CanContentScroll,
ListBox, .
,
.
,
. , ,
, ,
CanContentScroll false
, .

FAQ
ListBox (
ItemsControl)?
, ItemsCollection,
,
ItemsControl. ItemsCollection SortDescriptions.
, System.Compo
nentModel.SortDescription. ,
,
. ,
ContentControl Content:
//
myItemsControl.Items.SortDescriptions.Clear();
// Content
myItemsControl.Items.SortDescriptions.Add(
new SortDescription("Content", ListSortDirection.Ascending));

335

FAQ
ItemsControl
, ,
UI Spy?
, FrameworkElement,
Name,
.
, ,
AutomationProperties.
AutomationID ( System.Windows.Automation).

ListView
ListView, ListBox, ,
ListBox, , Extended
SelectionMode. ListView View,
,
ItemsPanel.
View ViewBase, .
WPF , GridView.
(Details) Windows. (
- WPF GridView DetailsView.)
.10.8 ListView,
XAML-, , sys
System mscorlib.dll:
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Header="Date"/>
<GridViewColumn Header="Day of Week"
DisplayMemberBinding="{Binding DayOfWeek}"/>
<GridViewColumn Header="Year" DisplayMemberBinding="{Binding Year}"/>
</GridView>
</ListView.View>
<sys:DateTime>1/1/2012</sys:DateTime>
<sys:DateTime>1/2/2012</sys:DateTime>
<sys:DateTime>1/3/2012</sys:DateTime>
</ListView>

GridView Columns,
GridViewColumn, ,
. WPF ListViewItem,
ListBoxItem. DateTime
ListViewItem, .

336

10.

.10.8. WPF ListView GridView

, ListView,
, ListBox,
DisplayMemberBinding GridView
Column. , ListView
, .
, DisplayMemberPath, ItemsCont
rol, DisplayMemberBinding
(. 13).
, GridView -
Windows, :

.

.

.
GridView
, , , .

( SortDescriptions),
,
, . , ListView
GridView DataGrid. ,
WPF4 DataGrid, GridView
.

TabControl
, TabControl,
. . 10.9 , TabControl
. ,
TabStripPlacment ( Dock) (Left),
(Right) (Bottom).
TabControl . -
.
:

337

<TabControl>
<TextBlock>Content for Tab 1.</TextBlock>
<TextBlock>Content for Tab 2.</TextBlock>
<TextBlock>Content for Tab 3.</TextBlock>
</TabControl>

.10.9. WPF TabControl

ComboBox ComboBoxItem, ListBox ListBoxItem ..,


TabControl TabItem.
, , - ,
TabItem, TabControl, TabItem
. , .10.9
XAML-:
<TabControl>
<TabItem Header="Tab 1">Content for Tab 1.</TabItem>
<TabItem Header="Tab 2">Content for Tab 2.</TabItem>
<TabItem Header="Tab 3">Content for Tab 3.</TabItem>
</TabControl>

TabItem , Header
GroupBox Expander.
, TabItem
.
, null SelectedItem -1
SelectedIndex.

DataGrid
DataGrid
, ,
.
(, System.Data.DataTable ADO.NET).
Visual Studio , LINQ to SQL,
.
10.2 XAML- DataGrid,
Record:
public class Record
{

338
public
public
public
public
public
}

10.
string FirstName {
string LastName {
Uri Website {
bool IsBillionaire {
Gender Gender {

get;
get;
get;
get;
get;

set;
set;
set;
set;
set;

}
}
}
}
}

Gender :
public enum Gender
{
Male,
Female
}

, .10.10 (
Record), Columns.
10.2. DataGrid

<DataGrid IsReadOnly="True"
xmlns:local="clr-namespace:Listing10_2"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<!--
DataGridComboBoxColumn: -->
<DataGrid.Resources>
<ObjectDataProvider x:Key="genderEnum" MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="local:Gender"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</DataGrid.Resources>
<!-- : -->
<DataGrid.Columns>
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/>
<DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
<DataGridHyperlinkColumn Header="Website" Binding="{Binding Website}"/>
<DataGridCheckBoxColumn Header="Billionaire?"
Binding="{Binding IsBillionaire}"/>
<DataGridComboBoxColumn Header="Gender" SelectedItemBinding="{Binding Gender}"
ItemsSource="{Binding Source={StaticResource genderEnum}}"/>
</DataGrid.Columns>
<!-- : -->
<local:Record FirstName="Adam" LastName="Nathan"
Website="http://adamnathan.net" Gender="Male"/>
<local:Record FirstName="Bill" LastName="Gates"
Website="http://twitter.com/billgates" IsBillionaire="True" Gender="Male"/>
</DataGrid>

339

.10.10. WPF DataGrid, 10.2

DataGrid
, ,
false : CanUserReor
derColumns, CanUserResizeColumns, CanUserResizeRows CanUserSortColumns.
GridLinesVisibility HeadersVisibility
.
10.2 ,
DataGrid:
DataGridTextColumn ,
TextBlock,
TextBox.
DataGridHyperlinkColumn
, . , ,
(,
). .
DataGridCheckBoxColumn ,
CheckBox,
true, false.
DataGridComboBoxColumn ,
TextBlock,
ComboBox, .
WPF :
DataGridTemplateColumn
.
CellTemplate CellEditingTemplate.


, DataGrid,
ItemsSource,
.
DataGridTextColumn, URI Data
GridHyperlinkColumn, Da
taGridCheckBoxColumn, Data
GridComboBoxColumn (
).

340

10.

, DataGrid:
<DataGrid Name="dataGrid" />

, .10.10,
ItemsSource, :
dataGrid.ItemsSource = new Record[]
{
new Record { FirstName="Adam", LastName="Nathan", Website=
new Uri("http://adamnathan.net"), Gender=Gender.Male },
new Record { FirstName="Bill", LastName="Gates", Website=
new Uri("http://twitter.com/billgates"), Gender=Gender.Male,
IsBillionaire=true }
};

,
. .10.11.

.10.11. WPF DataGrid ,


Record

,
DataGrid .10.11
.
Items DataGrid .
,
TextBox, CheckBox ,
Gender ()
ComboBox . ,
, ,
F2.
ItemsSource. (, IsBillionaire (
)
. , - .)
DataGrid - ,
.
,
AutoGeneratingColumn, .
AutoGeneratedColumns.

341

,
AutoGenerateColumns false.


DataGrid
SelectionMode SelectionUnit. SelectionMode
Single ,
Extended (
).
SelectionUnit:
Cell .
FullRow .
CellOrRowHeader (
).
Shift
, Ctrl
.
Selected, SelectedItems
. DataGrid
10.2 Record.
SelectedCellChanged, SelectedCells
DataGridCellInfo,
. DataGridRow
DataGridCell Selected, IsSelec
ted true.
,
.
CurrentCell. , CurrentColumn
, CurrentCell,
CurrentItem , ,
CurrentCell.

MultiSelector,
Selector WPF 3.5.
WPF , Da
taGrid MultiSelector.


DataGrid ,
, ,
.
. ,
DataGrid (, Ctrl+C

342

10.

), ClipboardCopyMode.
:
ExcludeHeader .
.
IncludeHeader .
None .
. DataGrid (
UIElement , ,

), .
EnableRowVirtualization ( false,
) EnableColumnVirtualization ( true,
). EnableColumnVirtualization
true,
.
. DataGrid
RowDe
tailsTemplate. :
<DataGrid ...>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<TextBlock Margin="10" FontWeight="Bold">Details go here.</TextBlock>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
...
</DataGrid>

RowDetailsTemplate
, ,
TextBlock. .10.12 ,
.

.10.12.
DataGrid


( ),
RowDetailsVisibilityMode, :

343

VisibleWhenSelected

. .
Visible .
Collapsed .

. DataGrid
. ,
.
Microsoft Excel. :

.
,
FrozenColumnCount , 0. .10.13 ,
DataGrid 10.2, FrozenColumnCount 2.
, , , -
.

.10.13. DataGrid 10.2,


FrozenColumnCount="2"

FAQ
DataGrid ?
, .
. AreRowDetails
Frozen true,
.p

,
, ItemsSource
.
ItemsSource ,
DataGrid .

344

10.


List<Record> (
):
dataGrid.ItemsSource = new List<Record>(
new Record[]
{
new Record { FirstName="Adam", LastName="Nathan", Website=
new Uri("http://adamnathan.net"), Gender=Gender.Male },
new Record { FirstName="Bill", LastName="Gates", Website=
new Uri("http://twitter.com/billgates"), Gender=Gender.Male,
IsBillionaire=true }
}
);

DataGrid ,
. DataGrid
, (
F2), ( Esc),
( Enter) ( Delete).
IsReadOnly
true, ,
false CanUserAddRows CanUserDeleteRows
. 10.2 IsReadOnly true,
,
Record .
( ) ,
,
: PreparingCellForEdit, BeginningEdit, CellEditEnding/RowEditEnding Initiali
zeNewItem.

CanUserAddRows CanUserDeleteRows
false!
, CanUserAddRows CanUser
DeleteRows false,
true! , IsReadOnly IsEnabled DataGrid
false, false .
:
( CanAddNew CanRemove,
IEditableCollectionView), CanUserAddRows, CanUserDeleteRows
false. , ,
IEditableCollectionView . 13.

345

WPF , : Menu ContextMenu. ,


Win32, WPF -
.
,
.

Menu
Menu
( ). Items
Control Menu IsMainMenu. true
( ), Menu
Alt F10, ,
Win32.
Menu ,
, ,
MenuItem Separator. .10.14
, 10.3.
10.3. MenuItem Separator
<Menu>
<MenuItem Header="_File">
<MenuItem Header="_New..."/>
<MenuItem Header="_Open..."/>
<Separator/>
<MenuItem Header="Sen_d To">
<MenuItem Header="Mail Recipient"/>
<MenuItem Header="My Documents"/>
</MenuItem>
</MenuItem>
<MenuItem Header="_Edit">
...
</MenuItem>
<MenuItem Header="_View">
...
</MenuItem>
</Menu>

MenuItem
( HeaderedItemsControl)
. MenuItem Header
( , , . .10.14).
Items, , ,
. Button Label, MenuItem
, .

346

10.

.10.14. WPF

Separator , , Menu
Item, , .10.14.
:
ToolBar StatusBar.
Menu , MenuItem
. .
Icon ,
Header. Icon , Header,
.
IsCheckable MenuItem CheckBox.
InputGestureText
( - ,
Ctrl+O).
MenuItem : Checked, Unchecked, Submenu
Opened, SubmenuClosed Click.
Click,
Command MenuItem.

InputGestureText MenuItem
!
WPF , Windows Forms Visual Ba
sic6, InputGestureText MenuItem "Ctrl+O"
, Ctrl+O
! .
MenuItem ,
Command.
, InputGestureText MenuItem
,
- .

347

Command MenuItem
RoutedUICommand, Header
Text . ,
Header .

FAQ
Menu , ?
Menu ,
ListBox
ItemsPanel,
StackPanel:
<Menu>
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
...
</Menu>

StackPanel ,
Orientation . .10.15.

.10.15.
, 90 (
Microsoft Office ,
),
RotateTransform.

ContextMenu
ContextMenu , Menu; ,
MenuItem Separator.
ContextMenu .

, ContextMenu FrameworkElement

348

10.

FrameworkContentElement. ,
(
Shift+F10).
.10.16 ,
ListBox (, ,
10.3):
<ListBox>
<ListBox.ContextMenu>
<ContextMenu>
... MenuItems 10.3...
</ContextMenu>
</ListBox.ContextMenu>
...
</ListBox>

IsOpen Opened/Closed, Context


Menu .
.
Placement , MousePoint
(, Absolute). HorizontalOffset Vertical
Offset .

.10.16. WPF

FAQ
,
?
ToolTipService, ContextMenuService
ShowOnDisabled . :
<ListBox ContextMenuService.ShowOnDisabled="True">
<ListBox.ContextMenu>
...
</ListBox.ContextMenu>
...
</ListBox>

349

, ToolTip ToolTipService,
,
. ContextMenu
ContextMenuService, .
, ,
ContextMenu.


TreeView, ToolBar StatusBar
, ,
.

TreeView
TreeView ,

, .10.17. Aero
, , Luna,
.
Aero

Luna

.10.17. WPF TreeView

TreeView, Menu, .
. TreeView
, -, TreeViewItem.
TreeViewItem, MenuItem, .
Header , Items
(, TreeViewItem).
TreeView, .10.17, XAML:
<TreeView>
<TreeViewItem Header="Desktop">
<TreeViewItem Header="Computer">
...

350

10.

</TreeViewItem>
<TreeViewItem Header="Recycle Bin">
...
</TreeViewItem>
<TreeViewItem Header="Control Panel">
<TreeViewItem Header="Programs"/>
<TreeViewItem Header="Security"/>
<TreeViewItem Header="User Accounts"/>
</TreeViewItem>
<TreeViewItem Header="Network">
...
</TreeViewItem>
</TreeViewItem>
</TreeView>

TreeViewItem IsExpanded IsSelected,


,
: Expanded, Collapsed, Selected Unselected. , TreeView
Item : (+)
() ,
, Page Up, Page Down, Home End
.


TreeView Selector
API TreeView Selector,
,
. Tree
View SelectedItem SelectedValue ( Selec
tedIndex). SelectedItemChanged,
, OldValue NewValue,
TreeView .

, WPF4. ,
- , Rad
TreeView Telerik (http://telerik.com/products/wpf/treeview.aspx).
TreeView
, ListBox, .

WPF 4 TreeView ,
Virtuali
zingStackPanel.IsVirtualizing TreeView true.
,
.

351

TreeView TreeViewItem!

TextBlock, ,
, -
, TextBlock, .
Foreground , TextBlock
,
. (
TreeViewItem,
.) ,
. TreeViewItem (
) TextBlock,
.

ToolBar
ToolBar ( )
( )
. .10.18
, XAML-:
<ToolBar RenderOptions.BitmapScalingMode="NearestNeighbor">
<Button><Image Source="copy.gif"/></Button>
<Separator/>
<ToggleButton><Image Source="bold.gif"/></ToggleButton>
<ToggleButton><Image Source="italic.gif"/></ToggleButton>
<ToggleButton><Image Source="underline.gif"/></ToggleButton>
<Separator/>
<ToggleButton><Image Source="left.gif"/></ToggleButton>
<ToggleButton><Image Source="right.gif"/></ToggleButton>
<ToggleButton><Image Source="justify.gif"/></ToggleButton>
<Separator/>
<Label>Zoom</Label>
<ComboBox>
...
</ComboBox>
<Separator/>
<Button><Image Source="superscript.gif"/></Button>
<Button><Image Source="subscript.gif"/></Button>
...
</ToolBar>

.10.18. WPF ToolBar

352

10.

, Button ComboBox
, . , Separator
, , Menu. ToolBar

, .
ToolBar ,
ToolBarTray, Frame
workElement. ToolBarTray ToolBar (
ToolBars) , IsLocked true,
.
( ToolBarTray IsLocked,
ToolBar.) ToolBarTray
Orientation; Vertical,
ToolBar .
ToolBar ,
, .
,
, .10.19.
,

OverflowMode ToolBar. ,

(AsNeeded ), (Always) (Never).

.10.19. ,

, Visual Studio,
ToolBar.OverflowMode Never ,
Menu "_Add or Remove Buttons" (
), ToolBar.OverflowMode
Always ( ).
MenuItem ,

, .

353

,
RenderOptions.BitmapScalingMode, NearestNeighbor.
,
. ToolBar
.
ToolBar,
Button . ,

. ( Popup Tool
Bar.) - .10.19
, .



ToolBar
:
<ToolBar>
<Button>A</Button>
<Menu>
<MenuItem Header="B"/>
<MenuItem Header="C"/>
</Menu>
<Button>D</Button>
</ToolBar>

ToolBar, Tab,
A B, C, D A
. ,
B C.
KeyboardNavigation System.Windows.Input

. ,
Tab , Key
boardNavigation.TabNavigation ToolBar Continue ( Cyc
le).
, Menu KeyboardNavigation.DirectionalNa
vigation, Continue.

354

10.


Header ToolBar
ToolBar (
MenuItem TreeViewItem). Header ,
ToolBarTray.
, ,
ToolBar ( Header),
.
, .

StatusBar
StatusBar , Menu,
, .10.20.
Window .

.10.20. WPF StatusBar

StatusBar, .10.20,
XAML-:
<StatusBar RenderOptions.BitmapScalingMode="NearestNeighbor">
<Label>27 Items</Label>
<Separator/>
<Label>Zoom</Label>
<ComboBox>
...
</ComboBox>
<Separator/>
<Button><Image Source="justify.gif"/></Button>
</StatusBar>

StatusBar Separa
tor , ,
ToolBar. StatusBar ( Separator)
StatusBarItem, .

, 5.

355

FAQ
,
?
,
. , 25% StatusBar,
75%. ,
ItemsPanel Grid :
<StatusBar>
<StatusBar.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</StatusBar.ItemsPanel>
<StatusBarItem Grid.Column="0">...</StatusBarItem>
<Separator Grid.Column="1"/>
<StatusBarItem Grid.Column="2">...</StatusBarItem>
</StatusBar>

, StatusBar
Grid.Column ( , ItemsPanel
Grid), 0. ,
, Sta
tusBarItem Separator. , (Label, ComboBox Button
StatusBar) StatusBarItem,
. ,
, StatusBarItem .

, ,
WPF. WPF-
, ,
. , ,
!

. ,
WPF.
, .

Image
Text Ink

11.

11

,
, . , Image, , ProgressBar Slider, , ,
WPF ,
. Calendar DatePicker WPF4.
, FrameworkContent
Element ( Control),
. , WPF.

Image
System.Windows.Controls.Image
( BMP, PNG, GIF, JPG .).
Source System.Windows.Media.ImageSource,
System.Windows.Media.ImageSourceConverter XAML
, :
<Image Source="zoom.gif"/>

ImageSource , URL, . (
, ,
.) Image Stretch
StretchDirection, 5
, .
Image ,
, .
Image RenderOptions.BitmapScalingMode,

357

Image

.
NearestNeighbor

, .
ToolBar Sta
tusBar, Photo Gallery 7
. :
<Image RenderOptions.BitmapScalingMode="NearestNeighbor" Source="zoom.gif"/>

,
. .11.1
Photo Gallery NearestNeighbor .

RenderOptions.BitmapScalingMode="NearestNeighbor"

.11.1. BitmapScalingMode NearestNeighbor,



ImageSource, Source
Image ImageSource,
. , BitmapImage ,
DecodePixelWidth DecodePixelHeight,
, ,
. FormatConvertedBitmap
Image, ,
. XAML-
FormatConvertedBitmap ,
.11.2:
<StackPanel Orientation="Horizontal">
<!-- , Pbgra32: -->
<Image Source="photo.jpg" />
<!-- : -->
<Image>
<Image.Source>
<FormatConvertedBitmap Source="photo.jpg" DestinationFormat="Gray32Float" />
</Image.Source>
</Image>
<!-- - : -->
<Image>

358

11. ,

<Image.Source>
<FormatConvertedBitmap Source="photo.jpg" DestinationFormat="BlackWhite" />
</Image.Source>
</Image>
</StackPanel>

System.Win
dows.Media.PixelFormats.

Pbgra32

( )

Gray32Float

BlackWhite

.11.2. Image
(. )

Text Ink
TextBlock Label WPF

, .
TextBlock,
:
TextBox
RichTextBox
PasswordBox
InkCanvas
WPF4,
.
WPF . ( ,
WPF
!) WPF
/
.

Text Ink

359

, ,
.
, ,
WPF .
, WPF4 .
, , -
. (, WPF
,
,
.)
.
, , TextOptions.Text
FormattingMode. ,
, Win
dow;
-. TextFormattingMode
Display, WPF 4,
, GDI.
,
(
).
TextFormattingMode ,
,
Ideal.
,
, .
,
, (
).
TextOptions.TextRenderingMode
ClearType, Grayscale, Aliased Auto
(antialiasing). Auto ( )
ClearType,
, Grayscale.
. 11.3 TextFormattingMode
TextRenderingMode, Auto,
.

.11.3. FontSize=11

360

11. ,

TextOptions.TextHintingMode Fixed,
Animated Auto ,
.

FAQ
Display
TextFormattingMode, ?
. (FontSize 15
), Ideal ,
Display, . ,
Display ,
.
Display
ScaleTransform, WPF
, . (
,
, ,
.) ,
, Display .

TextBlock
TextBlock ,
, FontFamily, FontSize, FontStyle, FontWeight FontStretch.
TextBlock ,
Text, Inlines.
, Text,
:
<!-- TextBlock.Inlines: -->
<TextBlock>Text in a TextBlock</TextBlock>

, ,
, Run.
XAML- :
<TextBlock><Run Text="Text in a TextBlock"/></TextBlock>

, , ( Text
Run):
<TextBlock><Run>Text in a TextBlock</Run></TextBlock>

Run .
Run , ,
TextBlock Run,
. , TextBlock
:

Text Ink

361

<TextBlock>
<Run>Text</Run>
<Run> in</Run>
<Run> a</Run>
<Run> TextBlock</Run>
</TextBlock>

. Run
,
, TextBlock,
: FontFamily, FontSize, FontStretch, FontStyle, FontWeight, Foreground TextDeco
rations. XAML-,
.11.4:
<TextBlock>
<Run FontStyle="Italic" FontFamily="Georgia" Foreground="Red">Rich</Run>
<Run FontSize="30" FontFamily="Comic Sans MS" Foreground="Blue"> Text </Run>
<Run FontFamily="Arial Black" Foreground="Orange" FontSize="100">in</Run>
<Run FontFamily="Courier New" FontWeight="Bold" Foreground="Green"> a </Run>
<Run FontFamily="Verdana" TextDecorations="Underline">TextBlock</Run>
</TextBlock>

.11.4. Run
TextBlock

, , , ,
, .
,
TextBlock. , TextBlock
,
. Run Inline;
.


TextBlock
TextBlock Text,
. Inlines
XAML, .
, ( HTML).

362

11. ,

Inlines TextBlock
Text.
- Text,
Inlines. , TextBlock .11.4
Text "Rich Text in a TextBlock", .


Run
TextBlock:
<TextBlock>Text in a TextBlock</TextBlock>

:
<TextBlock><Run>Text in a TextBlock</Run></TextBlock>

. ,
LineBreak ( Inline) :
<TextBlock>Text in<LineBreak/>a TextBlock</TextBlock>

:
<TextBlock><Run>Text in<LineBreak/>a TextBlock</Run></TextBlock>

, Run
(Text) , LineBreak
. Text
Block (Inlines) Run,
LineBreak. XAML-:
<TextBlock>Text in<LineBreak/>a TextBlock</TextBlock>

TextBlock, Run,
LineBreak:
<TextBlock><Run>Text in</Run><LineBreak/><Run>a TextBlock</Run></TextBlock>

TextBox
TextBox, .11.5,
.
WPF, TextBox
System.Object, Text.

.11.5. WPF TextBox

Text Ink

363

TextBox ,
, Cut, Copy, Paste, Undo
Redo (. 6 : , ,
) !
TextBox
( , ..),

. TextChanged SelectionChanged.
TextBox (
), .
TextBox , ,
TextWrapping Wrap WrapWithOverflow. Wrap
,
, .
WrapWithOverflow , ,
. ( TextBlock
TextWrapping.)

FAQ
, TextBox
?
AcceptsReturn true,
Enter . , TextBox
.
Text , NewLine,
AcceptsReturn. ,
.
,
TextBox.



TextBox ( RichTextBox),
SpellCheck.IsEnabled true.
, Microsoft Word:
,
, . WPF
, Microsoft Office
( ).
WPF .

364

11. ,

RichTextBox
RichTextBox , TextBox,
(
). .11.6 RichTextBox
.

.11.6. WPF RichTextBox

RichTextBox TextBox (TextBoxBase),


, TextBox, RichTextBox.
TextBox RichTextBox . , TextBox
CaretIndex, Selection
Start SelectionEnd, RichTextBox CaretPosition TextPo
inter Selection TextSelection. , RichText
Box Document FlowDocument,
Text. UIElement,
,
IsDocumentEnabled RichTextBox true. Flow
Document .

PasswordBox
PasswordBox TextBox,
. ,
.11.7.

.11.7. WPF PasswordBox

PasswordBox TextBoxBase,
, Cut, Copy, Undo Redo (
Paste), .
, !
,
PasswordChar. ( ,
, .)
PasswordBox Password.

System.Security.SecureString. SecureString
, System.String

Text Ink

365

,
.
TextboxPasswordChanged.
RoutedEventHandler,
.
, Password.

InkCanvas
InkCanvas
( ,
). .11.8. ,
InkCanvas ,
FrameworkElement, ,
( , ).

.11.8. WPF InkCanvas

InkCanvas
. ,
.
System.Windows.Ink.Stroke,
Strokes. InkCanvas
UIElement Children ( ).
,
.11.9.

.11.9.

366

11. ,

,
Window:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
SizeToContent="WidthAndHeight">
<Grid>
<InkCanvas>
<Image Source="http://adamnathan.net/blog/images/anathan.png"/>
</InkCanvas>
</Grid>
</Window>

SizeToContent
, Window
, !
DefaultDrawingAttributes
(, ..). Stroke Drawing
Attributes,
.
InkCanvas ,
( )
EditingMode Editing
ModeInverted. ActiveEditingMode
, .
InkCanvasEditingMode,
:
Ink .
EditingMode.
InkAndGesture Ink, .
(Up, Down, Circle, ScratchOut, Tap .)
System.Windows.Ink.ApplicationGesture.
GestureOnly , .
EraseByStroke , .
EditingModeInverted.
EraseByPoint ,
( ).
Select UIElement ,

, InkCanvas.
None .
Select ,
, ,

. InkCanvas 15 ,
, ,

367

, ,
.
,
!
. WPF
,
.

TextBlock Label
, TextBox RichTextBox
. WPF
!
WPF , ,
, .
.
( FlowDocument)
, ,
. ,
.


FlowDocument FrameworkContentElement, Frame
workElement, .
FrameworkContentElement, FrameworkElement,
, WPF,
. FrameworkCon
tentElement - FrameworkElement.

FAQ
WPF
XML Paper Specification (XPS)?
,
, XPS-
, . .NET Framework
XPS- (
System.Windows.Xps System.Windows.Documents),
, Microsoft Word.
WPF- XPS-
FixedDocument DocumentViewer.

368

11. ,

XPS- Adobe PDF;


(
), (
). XPS ,
Windows ( Win
dows Vista). , XPS-
,
, .
XPS Open Packaging
Conventions ( System.
IO.Packaging) http://microsoft.com/xps.

, FrameworkContentElement, Text
Element , ,
FlowDocument.
TextElement ( System.Windows.
Documents) ,
.


XAML- FlowDocument,
Paragraph ( TextElement)
.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Paragraph FontSize="22" FontWeight="Bold">Chapter 1</Paragraph>
<Paragraph FontSize="35" FontWeight="Bold">Why WPF?</Paragraph>
<Paragraph>
In movies and on TV, the ...
</Paragraph>
<Paragraph>...</Paragraph>
<Paragraph>...</Paragraph>
...
</FlowDocument>

.11.10 XAML-.
FlowDocument XAML-,
.
TextElement Block Inline (
, TextElement). Block
,
, Inline , , ,
(
). FlowDocument Block
. ( Blocks
BlocksCollection.) Inline
, .

369

.11.10. FlowDocument

Block
WPF :
Paragraph Inlines,
. XAML Paragraph
,
Run, Inline, Inlines
, TextBlock.
Section ,
. ,
, Background
Foreground.
List ListItem
, . ListItem
Block, List
Paragraph ListItem.
MarkerStyle ( TextMarkerStyle)
Box, Circle, Disc ( )
Square Decimal, LowerLatin, UpperLatin, LowerRoman UpperRo
man. , MarkerSty
le None.
Table ,
Grid, HTML-. Table,
Grid, Block (,
).
BlockUIContainer UIElement. Block
UIContainer WPF-
FlowDocument: Image, , MediaEle
ment, Button, Viewport3D ..

370

11. ,

11.1
FlowDocument.
.11.11.
11.1. FlowDocument, .11.11
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Section LineHeight="2" Foreground="White" Background="Black">
<Paragraph FontSize="18">WPF 4 Unleashed</Paragraph>
<Paragraph FontSize="30" FontWeight="Bold">Notes from Chapter 1</Paragraph>
</Section>
<Paragraph>Here are some highlights of WPF:</Paragraph>
<List>
<ListItem>
<Paragraph>Broad integration</Paragraph>
</ListItem>
<ListItem>
<Paragraph>Resolution independence</Paragraph>
</ListItem>
<ListItem>
<Paragraph>Hardware acceleration</Paragraph>
</ListItem>
<ListItem>
<Paragraph>Declarative programming</Paragraph>
</ListItem>
<ListItem>
<Paragraph>Rich composition and customization</Paragraph>
</ListItem>
</List>
<BlockUIContainer>
<Viewbox>
<StackPanel Orientation="Horizontal">
<Image Source="diagram.jpg" Margin="5"/>
<TextBlock VerticalAlignment="Center" Width="100" TextWrapping="Wrap">
The technologies in the .NET Framework.
</TextBlock>
</StackPanel>
</Viewbox>
</BlockUIContainer>
<Paragraph>
Here's another version of the diagram, as a Table:
</Paragraph>
<Table CellSpacing="5" Padding="15" FontFamily="Segoe UI">
<Table.Background>
<LinearGradientBrush>
<GradientStop Color="Yellow" Offset="0"/>
<GradientStop Color="Orange" Offset="1"/>
</LinearGradientBrush>
</Table.Background>


<!-- : -->
<Table.Columns>
<TableColumn/>
<TableColumn/>
<TableColumn/>
<TableColumn/>
</Table.Columns>
<!-- : -->
<TableRowGroup>
<TableRow>
<TableCell ColumnSpan="4" TextAlignment="Center">
<Paragraph FontWeight="Bold">.NET Framework</Paragraph>
</TableCell>
</TableRow>
<TableRow>
<TableCell BorderBrush="Black" BorderThickness="2"
Background="LightGray" TextAlignment="Center" LineHeight="70">
<Paragraph FontWeight="Bold">WPF</Paragraph>
</TableCell>
<TableCell BorderBrush="Black" BorderThickness="2"
Background="LightGray" TextAlignment="Center">
<Paragraph FontWeight="Bold">WCF</Paragraph>
</TableCell>
<TableCell BorderBrush="Black" BorderThickness="2"
Background="LightGray" TextAlignment="Center">
<Paragraph FontWeight="Bold">WF</Paragraph>
</TableCell>
<TableCell BorderBrush="Black" BorderThickness="2"
Background="LightGray" TextAlignment="Center">
<Paragraph FontWeight="Bold">WCS</Paragraph>
</TableCell>
</TableRow>
<TableRow>
<TableCell BorderBrush="Black" BorderThickness="2"
Background="LightGray" TextAlignment="Center">
<Paragraph FontWeight="Bold">ADO.NET</Paragraph>
</TableCell>
<TableCell BorderBrush="Black" BorderThickness="2"
Background="LightGray" TextAlignment="Center">
<Paragraph FontWeight="Bold">ASP.NET</Paragraph>
</TableCell>
<TableCell BorderBrush="Black" BorderThickness="2"
Background="LightGray" TextAlignment="Center">
<Paragraph FontWeight="Bold">Windows Forms</Paragraph>
</TableCell>
<TableCell BorderBrush="Black" BorderThickness="2"
Background="LightGray" TextAlignment="Center">
<Paragraph FontWeight="Bold">...</Paragraph>
</TableCell>

371

372

11. ,

</TableRow>
</TableRowGroup>
</Table>
</FlowDocument>
Paragraph

Section

Table

List

BlockUIContainer
.11.11. FlowDocument,

Paragraph ,
Section , Paragraph
Foreground, Background LineHeight. List
, .
BlockUIContainer Image,
TextBlock.
StackPanel Viewbox,
.
,
Table. , API Table (,
Table XAML-) Grid.
TableColumn Columns
( ColumnDefinitions Grid),
. , Table
TableRowGroup, TableRow
, , .
TableCell TableRow
, ColumnSpan
. TableCell , Block,
, Paragraph.

373

Table TableRowGroup! ,
, .
. 11.11 ,
Image. ,
. Table ,
.
, . ,
,
. .11.12 , .

.11.12. .11.11
2, 3

Inline
Inline Paragraph,
. ,
Paragraph ,
Inline. , Paragraph, XAML,
, Run,
Inline. Run Text,
.
, Paragraph, XAML
:
<Paragraph>Here are some highlights of WPF:</Paragraph>

C#:
Paragraph p = new Paragraph(new Run("Here are some highlights of WPF:"));

Inline
: (span), .

374

11. ,

. Bold,
Italic, Underline Hyperlink 7.
Span, Paragraph
. Paragraph
(
, ..) , FontWeight
FontStyle,
, .
Paragraph, .11.13,
:
<Paragraph>
<Bold>bold</Bold>
<Italic>italic</Italic>
<Underline>underline</Underline>
<Hyperlink>hyperlink</Hyperlink>
<Span BaselineAlignment="Superscript">superscript</Span>
<Span BaselineAlignment="Subscript">subscript</Span>
<Span>
<Span.TextDecorations>
<TextDecoration Location="Strikethrough"/>
</Span.TextDecorations>
strikethrough
</Span>
</Paragraph>

.11.13.

TextBlock Inline,
Paragraph
TextBlock, -. , Label
.

BaselineAlignment TextDecorations, Span,


Inline,
Bold, Italic . ,
Paragraph,
Inline, . XAML-

375

, Paragraph
Run. , ,
Paragraph,
.11.14:
<Paragraph>
a<Bold>b<Italic>c<Underline>d<Hyperlink>e</Hyperlink>f</Underline>g</Italic>h
</Bold>i
</Paragraph>

.11.14. Hyperlink, Underline,


Italic, , , Bold

. WPF Inline, ,
Block. Figure
Floater AnchoredBlock.
Figure - -FlowDocument,
FlowDocument.
, Figure. , FlowDocument
1 , (
).
:
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Paragraph FontSize="22" FontWeight="Bold">Chapter 1</Paragraph>
<Paragraph FontSize="35" FontWeight="Bold">Why WPF?</Paragraph>
<Paragraph>
<Figure Width="130">
<BlockUIContainer>
<Image Source="wpf.png"/>
</BlockUIContainer>
</Figure>
In movies and on TV, the ...
</Paragraph>
<Paragraph>...</Paragraph>
<Paragraph>...</Paragraph>
...
</FlowDocument>

Figure Block, ,
Table, Paragraph .
BlockUIContainer,
. .11.15.
Figure HorizontalAnchor
VerticalAnchor ( FigureHorizontalAnchor FigureVerticalAnchor

376

11. ,

). HorizontalAnchor ColumnRight, VerticalAnchor


ParagraphTop.
.
.11.16
Figure, .11.15, Horizon
talAnchor / VerticalAnchor.

.11.15. FlowDocument
Figure, Image

Floater Figure.
Block,
, .
HorizontalAnchor VerticalAnchor
HorizontalAlignment ( HorizontalAlignment),
Left, Center, Right Stretch.
Figure,
Floater.
Inline. Inline
,
Span AnchoredBlock. LineBreak,
. LineBreak
, .

FlowDocument , ,
BreakPageBefore Paragraph,
. BreakPageBefore Block,
Section, List, BlockUIContainer Table.

377

HorizontalAnchor="ColumnLeft"

HorizontalAnchor="PageCenter"

HorizontalAnchor="PageRight" VerticalAnchor="PageTop"
.11.16. Figure
HorizontalAnchor VerticalAnchor

378

11. ,

, Inline, InlineUIContainer,
BlockUIContainer , Para
graph . Block
UIContainer, MediaElement, Button,
Viewport3D ..,
, .
, .11.17, ,
RSS- Hyperlink :
<Paragraph>
You can read more about this on my blog (
<Hyperlink NavigateUri="http://blogs.msdn.com/adam_nathan/rss.xml">
subscribe
</Hyperlink>
<InlineUIContainer>
<Image Width="14" Source="rss.gif"/>
</InlineUIContainer>
), which I try to update once a month.
</Paragraph>

.11.17. Paragraph Image


InlineUIContainer


, FlowDocument (
) RichTextBox. ,
RichTextBox IsReadOnly true, RichTextBox
.
WPF
. , ,
, :
FlowDocumentScrollViewer
, - Microsoft Word
( RichTextBox,
ScrollViewer).
FlowDocumentPageViewer
, Microsoft Word.
FlowDocumentReader FlowDocumentScrollViewer Flow
DocumentPa
geViewer
, . (
, FlowDocument
XAML-.)

379

FlowDocumentScrollViewer

FlowDocumentPageViewer

FlowDocumentReader
.11.18. 1 FlowDocument

.11.18
FlowDocument, .

380

11. ,

FlowDocumentReader (
XPS- PDF-),

, , ,
. FlowDocumentPageViewer, FlowDocumentReader (
)
,
.
, FlowDocumentScrollViewer
, , ,
IsToolBarVisible true.


FlowDocument ( Docu
mentViewer, FixedDocument)
,

. ,

.
,
. AnnotationService
System.Windows.Annotations,
:
CreateTextStickyNoteCommand Sticky
NoteControl .
CreateInkStickyNoteCommand Sti
ckyNoteControl .
DeleteStickyNotesCommand
StickyNoteControl.
CreateHighlightCommand ,
.
ClearHighlightsCommand
.
11.2 Window, FlowDocu
mentReader .
.
11.2. Window1.xaml FlowDocument
Reader
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:a="clr-namespace:System.Windows.Annotations;assembly=PresentationFramework"

381

Title="FlowDocumentReader + Annotations"
x:Class="Window1" Initialized="OnInitialized" Closed="OnClosed">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label>Control Annotations:</Label>
<Button Command="a:AnnotationService.CreateTextStickyNoteCommand"
CommandTarget="{Binding ElementName=reader}">
Create Text Note
</Button>
<Button Command="a:AnnotationService.CreateInkStickyNoteCommand"
CommandTarget="{Binding ElementName=reader}">
Create Ink Note
</Button>
<Button Command="a:AnnotationService.DeleteStickyNotesCommand"
CommandTarget="{Binding ElementName=reader}">
Remove Note
</Button>
<Button Command="a:AnnotationService.CreateHighlightCommand"
CommandParameter="{x:Static Brushes.Yellow}"
CommandTarget="{Binding ElementName=reader}">
Create Yellow Highlight
</Button>
<Button Command="a:AnnotationService.ClearHighlightsCommand"
CommandTarget="{Binding ElementName=reader}">
Remove Highlight
</Button>
</StackPanel>
<FlowDocumentReader x:Name="reader">
<FlowDocument>
...
</FlowDocument>
</FlowDocumentReader>
</StackPanel>
</Window>

.NET System.Windows.Annotations
XML a,
AnnotationService. AnnotationService PresentationFramework,
- WPF
XML. ,
FlowDocumentReader.
,
.
OnInitialized OnClosed,
XAML-. 11.3
, 11.2.

382

11. ,

11.3. Window1.xaml.cs FlowDocument


Reader
using
using
using
using
using

System;
System.IO;
System.Windows;
System.Windows.Annotations;
System.Windows.Annotations.Storage;

public partial class Window1 : Window


{
FileStream stream;
public Window1()
{
InitializeComponent();
}
protected void OnInitialized(object sender, EventArgs e)
{
//
AnnotationService service = AnnotationService.GetService(reader);
if (service == null)
{
stream = new FileStream("storage.xml", FileMode.OpenOrCreate);
service = new AnnotationService(reader);
AnnotationStore store = new XmlStreamStore(stream);
store.AutoFlush = true;
service.Enable(store);
}
}
protected void OnClosed(object sender, EventArgs e)
{
//
AnnotationService service = AnnotationService.GetService(reader);
if (service != null && service.IsEnabled)
{
service.Disable();
stream.Close();
}
}
}

OnInitialized OnClosed
AnnotationService, FlowDocumentReader.
Stream,
. 11.3
XML- .
(
, storage.xml ).

383

. 11.19 ,
.

.11.19.
FlowDocument

StickyNoteControl, ,
WPF ( System.Win
dows.Controls). ,
.



, .
,
.

RangeBase. double,
: Value, Minimum,
Maximum. ValueChanged.
: Progress
Bar Slider. WPF ScrollBar,

384

11. ,

RangeBase, ,
. ScrollViewer,
5.

ProgressBar
,
ProgressBar.
- , ProgressBar
, - .

. (, ,
!) .11.20 ,
WPF ProgressBar .

.11.20. WPF ProgressBar

Minimum ProgressBar 0, Maxi


mum 100. RangeBase :
IsIndeterminate true, ProgressBar
, Minimum, Maximum Value
. , ,
, ,
!
Orientation Horizontal,
Vertical, ,
. ,
,
. ,
!

FAQ
ProgressBar ,
- ?
Windows Vista, Win32
( ) / (
). , WPF ProgressBar
. ,

, 14 , , .

385

Slider
Slider () , ProgressBar,
,
. .11.21.

.11.21. WPF Slider

Minimum 0, Maximum 10.


, Slider Orientation (
Horizontal), ,
ToolTip,
, ,
,
. Slider
Delay Interval,
RepeatButton.
, TickPlacement
TopLeft, BottomRight Both.
Slider. TickPlacement BottomRight,
, ,
. , TickPlacement TopLeft,
, ,
. TickPlacement None (
), , .11.22.

.11.22. Slider

.11.23. Slider

Slider
, .11.23.
IsSelectionRangeEnabled true, SelectionStart Selection
End .
,
, ,
.
, Windows Media Player,
, .

386

11. ,


WPF4 ,
: Calendar DatePicker.
WPF ,
.

Calendar
Calendar, . 11.24,
, Windows.
DisplayMode .
, ,
(Month) (Year) (Decade),
. Win
dows, WPF Calendar ,
, ,
.

Month ( )

Year

Decade

.11.24. WPF Calendar DisplayMode


, 20 2012

DisplayDate Calendar ( DateTime)


( .11.24 20 2012). Dis
playDate , Month
. 20
. 11.24 , Calendar
DisplayDate. ,
IsTodayHighlighted false.
SelectionMode
:
SingleDate
, SelectedDate. .
SingleRange ,
. Selec
tedDates.

387

MultipleRange ,

SelectedDates.
None .

, Calendar,
DisplayDateStart / DisplayDateEnd ( DateTime). .11.25
, DisplayMode.
,
Month 44 .

Month ( )

Year

Decade

.11.25. , DisplayDateStart 10 2012,


DisplayDateEnd 25 2012

,
, . BlackoutDates,
CalendarDateRange. . 11.26 ,
, BlackoutDates :
<Calendar>
<Calendar.BlackoutDates>
<CalendarDateRange Start="4/1/2012" End="4/19/2012"/>
<CalendarDateRange Start="5/1/2012" End="5/5/2012"/>
</Calendar.BlackoutDates>
</Calendar>

Month.

.11.26. , BlackoutDates
CalendarDateRanges

388

11. ,

BlackoutDates CalendarBlackoutDatesCollection,
ObservableCollection<CalendarDateRange>.
AddDatesInPast. ,
.
, CalendarDateRange, DateTime.
MinValue (1 0001) Start DateTime.Today
End.

FirstDayOfWeek Calendar ,
, , ,
System.DayOfWeek,
. Calendar ,
: DisplayDateChanged, DisplayMode
Changed, SelectionModeChanged SelectedDatesChanged (
, ).

DatePicker
DatePicker ,
TextBox ,
Calendar, .
DatePicker .11.27.

.11.27. WPF DatePicker


Ca
lendar, DatePicker
. DatePicker , Calendar,
DisplayMode, SelectionMode
.
DisplayMode=Month SelectionMode=SingleDate.
, SelectedDatesChanged DatePicker

389

SelectedDateChanged. -
DatePicker DisplayDateChanged, Calendar.
DatePicker
TextBox
. IsDropDownOpen
,
. CalendarOpened CalendarClosed ,
. Selected
DateFormat , TextBox
. Short,
4/20/2012. Long, Friday,
April 20, 2012. , TextBox,
Text. ,
, DateValidationError.
DatePicker ( DatePickerTextBox,
TextBox)
, -
15.
.

, ,
( )
.
, 14,
.

IV
IV.

12
13
14 , ,

12
12.

.NET Framework
,
. , , , , -
. , WPF
.NET, . WPF
:
.


,
.NET Framework. WPF-

. XAML-
. :

,

:
,
, ( ),
.
, .

394

12.


,
Visual Studio
, . 12.1
logo.jpg.

.12.1. Visual Studio

Visual Studio WPF,


:
Resource (
).
Content ,
(AssemblyAssociatedContentFile),
.
MSBuild,
:
<BuildAction Include="logo.jpg"/>

BuildAction .
, , :
<Content Include="logo.jpg">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>

,
, Content, ;

. ,

395

(. ).
,
, ,
.

Embedded Resource!
Resource Embedded
Resource ( Visual Studio Embedded Resource).
, WPF-
. Resource
WPF, EmbeddedResource WPF (
Windows Forms).
WPF,
(. ), ,
Content Resource.
, , Content
Resource, XAML-, ,
EmbeddedResource, (
, ).

( Reso
urce), , ,
, ,
.

( , HTML-, ),
Content.


, Resource,
,
Content,
- , WPF
, XAML,
(URI). ,
URI XAML- ,
.
Photo Gallery
7 .
XAML ,
Resource:

396

12.

<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Center">


<Button x:Name="previousButton" ToolTip="Previous (Left Arrow)" ...>
<Image Height="21" Source="previous.gif"/>
</Button>
<Button x:Name="slideshowButton" ToolTip="Play Slide Show (F11)" ...>
<Image Height="21" Source="slideshow.gif"/>
</Button>
<Button x:Name="nextButton" ToolTip="Next (Right Arrow)" ...>
<Image Height="21" Source="next.gif"/>
</Button>
</StackPanel>

, XAML- ,
GIF- Content, Reso
urce ( ,
). GIF- ,
.

XAML-
,
!
, XAML-,
,
:
<Image Height="21" Source="slideshow.gif"/>

, ,
, . ()
, :
<Image Height="21" Source="C:\Users\Adam\Documents\slideshow.gif"/>


, , :
<Image Height="21" Source="pack://siteOfOrigin:,,,/slideshow.gif"/>

, ,
Image - , ,
URI, . .12.1
URI XAML-. ,
.
, .12.1 ,
. ,
( ),
XAML-.

397

12.1. URI XAML-


( logo.jpg)
URI

logo.jpg


,
XAML- (
,
Content)

A/B/logo.jpg


(A\B),
,
A\B
XAML- (
,
Content)

c:\temp\logo.jpg

c:\
temp

file://c:/temp/logo.jpg


c:\temp

\\pc1\images\logo.jpg


\\pc1\images

http://adamnathan.net/logo.jpg

- adamna
than.net

/MyDll;Component/logo.jpg

MyDll.dll
MyDll.exe

/MyDll;Component/A/B/logo.jpg

MyDll.dll
MyDll.exe
(A\B),

pack://siteOfOrigin:,,,/logo.jpg

pack://siteOfOrigin:,,,/A/B/logo.jpg

A\B

FAQ

?
. 12.1 ,
, - .
, ,
, .
,
.

398

12.


,
, .
, , logo.jpg images Visual Stu
dio;
<Resource Include="images\logo.jpg"/>

<Content Include="images\logo.jpg"/>

, logo.jpg
images ,
:
<Image Source="images\logo.jpg"/>

.12.1
.
, , ,
(site of origin).

,
,
, ( ,
),
. .12.1, URI
/AssemblyReference;Component/ResourceName

AssemblyReference , Component
, . ResourceName (
).
AssemblyReference
.NET:
( ).
, AssemblyReference:
AssemblyName
AssemblyName;vVersionNumber ( v )
AssemblyName;PublicKeyToken
AssemblyName;vVersionNumber;PublicKeyToken



(URL)
,
. (
.)

399


:
,
Windows, .
ClickOnce-
URL UNC-, .
XBAP- ClickOnce-
URL UNC- , .
XAML-, ,
.
.
, ,
! pack://siteOf
Origin:,,,/, (,
). , siteOfOrigin , ,
, .

FAQ
?
URI pack XML Paper Specification
(XPS), http://microsoft.com/whdc/xps/xpsspec.
mspx. :
pack://packageURI/partPath

packageURI URI ,
. packageURI
XPS-, file:///C:/Document.xps,
file:,,,C:,Document.xps. WPF-
, URI,
:
siteOfOrigin:/// ( siteOfOrigin:,,,)
application:/// ( application:,,,)
, ,
! (,
/ .)
application:/// ,
.12.1, , siteOfOrigin. (
, WPF
IUriContext. BaseUri,
URI.) , URI,
XAML-:
logo.jpg

400

12.


pack://application:,,,/logo.jpg

URI:
/MyDll;Component/logo.jpg


pack://application:,,,/MyDll;Component/logo.jpg

XAML
URI, .


URI C#
XAML ,
.12.1. URI URI
pack URL.
, Source Image
logo.jpg:
Image image = new Image();
image.Source = new BitmapImage(new Uri("pack://application:,,,/logo.jpg"));

System.Windows.Media.Imaging.BitmapImage
( ,
JPEG, PNG, GIF BMP),
ImageSource ( Source). URI
System.Uri.
pack://application:,,,/ ,
,
Resource Content. ,
, ,
URI siteOfOrigin.


,
, (
),
. , , ,
,
. LocBaml, Windows
SDK, ,
XAML
. LocBaml
.

401



,
UICulture. Visual Studio ,
,
.

Visual Studio.
(
). ,

Edit ().

UICulture Pro
pertyGroup, ,
(Debug, Release ..), ,
,
.
(
):
<Project ...>
<PropertyGroup>
<UICulture>en-US</UICulture>
...

,
en-US,
AssemblyName.resources.dll.
NeutralResourcesLanguage
, :
[assembly: NeutralResourcesLanguage("en-US",
UltimateResourceFallbackLocation.Satellite)]



Uid
XAML (x:Uid) , .

. , , ,
MSBuild :
msbuild /t:updateuid ProjectName.csproj

402

12.

XAML-
x:Uid .
Build,
, .

LocBaml
, Uid,
LocBaml Windows SDK .resources,
( obj\debug):
LocBaml /parse ProjectName.g.en-US.resources /out:en-US.csv

CSV-,
, .
, (
!). LocBaml
, CSV-
! , CSV-
, fr-CA.csv,
LocBaml :
LocBaml /generate ProjectName.resources.dll /trans:fr-CA.csv /cul:fr-CA

,
, , (
fr-CA).
,
System.Threading.Thread.CurrentThread.CurrentUICulture (System.Threading.Thread.
CurrentThread.CurrentCulture) CultureInfo.


WPF WPF,
Silverlight.
,
,
. ( XAML-, ,
XAML,
.)
.NET,
Resources. ,
.
Resources ( System.Windows.ResourceDictionary)
FrameworkElement FrameworkContentElement, ,
WPF.
(. 14 , , )
(. 13 ).
Brush.

403

12.1 Window,
Photo
Gallery.
Brush Background BorderBrush Button (
Window). .12.2.

.12.2. 12.1

12.1.
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Simple Window" Background="Yellow">
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal"
HorizontalAlignment="Center">
<Button Background="Yellow" BorderBrush="Red" Margin="5">
<Image Height="21" Source="zoom.gif"/>
</Button>
<Button Background="Yellow" BorderBrush="Red" Margin="5">
<Image Height="21" Source="defaultThumbnailSize.gif"/>
</Button>
<Button Background="Yellow" BorderBrush="Red" Margin="5">
<Image Height="21" Source="previous.gif"/>
</Button>
<Button Background="Yellow" BorderBrush="Red" Margin="5">
<Image Height="21" Source="slideshow.gif"/>
</Button>
<Button Background="Yellow" BorderBrush="Red" Margin="5">
<Image Height="21" Source="next.gif"/>
</Button>
<Button Background="Yellow" BorderBrush="Red" Margin="5">
<Image Height="21" Source="counterclockwise.gif"/>
</Button>
<Button Background="Yellow" BorderBrush="Red" Margin="5">
<Image Height="21" Source="clockwise.gif"/>
</Button>
<Button Background="Yellow" BorderBrush="Red" Margin="5">
<Image Height="21" Source="delete.gif"/>
</Button>
</StackPanel>
<ListBox/>

404

12.

</DockPanel>
</Window>


Window .
.
(CSS)
-,
.
, ,
, ,
. 12.2
.
12.2.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Simple Window">
<Window.Resources>
<SolidColorBrush x:Key="backgroundBrush">Yellow</SolidColorBrush>
<SolidColorBrush x:Key="borderBrush">Red</SolidColorBrush>
</Window.Resources>
<Window.Background>
<StaticResource ResourceKey="backgroundBrush"/>
</Window.Background>
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal"
HorizontalAlignment="Center">
<Button Background="{StaticResource backgroundBrush}"
BorderBrush="{StaticResource borderBrush}" Margin="5">
<Image Height="21" Source="zoom.gif"/>
</Button>
<Button Background="{StaticResource backgroundBrush}"
BorderBrush="{StaticResource borderBrush}" Margin="5">
<Image Height="21" Source="defaultThumbnailSize.gif"/>
</Button>
<Button Background="{StaticResource backgroundBrush}"
BorderBrush="{StaticResource borderBrush}" Margin="5">
<Image Height="21" Source="previous.gif"/>
</Button>
<Button Background="{StaticResource backgroundBrush}"
BorderBrush="{StaticResource borderBrush}" Margin="5">
<Image Height="21" Source="slideshow.gif"/>
</Button>
<Button Background="{StaticResource backgroundBrush}"
BorderBrush="{StaticResource borderBrush}" Margin="5">
<Image Height="21" Source="next.gif"/>
</Button>
<Button Background="{StaticResource backgroundBrush}"

405

BorderBrush="{StaticResource borderBrush}" Margin="5">


<Image Height="21" Source="counterclockwise.gif"/>
</Button>
<Button Background="{StaticResource backgroundBrush}"
BorderBrush="{StaticResource borderBrush}" Margin="5">
<Image Height="21" Source="clockwise.gif"/>
</Button>
<Button Background="{StaticResource backgroundBrush}"
BorderBrush="{StaticResource borderBrush}" Margin="5">
<Image Height="21" Source="delete.gif"/>
</Button>
</StackPanel>
<ListBox/>
</DockPanel>
</Window>

x:Key
ResourceDictionary 2 XAML.
StaticRe
source ( System.Windows.StaticResourceExtension).
Window.Background , But
ton.Background Button.BorderBrush .
Brush, ,
.
12.2 -
,
.12.2.
, XAML- ( ,
). ,
backgroundBrush - :
<LinearGradientBrush x:Key="backgroundBrush" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Blue" Offset="0"/>
<GradientStop Color="White" Offset="0.5"/>
<GradientStop Color="Red" Offset="1"/>
</LinearGradientBrush>

, .12.3.

.12.3. , 12.2,
backgroundBrush -

406

12.


StaticResource
.
.
.

.
Resources ( ). ,
..,
. Resources Application.
,
(. 14). ,
( ,
). ,
InvalidOperationException.
,
,
. , ,
,
.
, ,
, .


!
7 , WPF-
.
.
, Freezable
, x:Shared=false,
, .


WPF :
StaticResource ,
( )
DynamicResource
,
DynamicResource (System.Windows.DynamicResourceExtension)
, StaticResource,

407

DynamicResource StaticResource .

, ; , ,
, .
-
StaticResource, DynamicResource, ,
.


StaticResource DynamicResource ,
,
DynamicResource.
(,
), .
StaticResource DynamicResource
. , DynamicResource
,
. , DynamicResource
. , StaticResource,
Window Page,
DynamicResource , .
, DynamicResource
, StaticResource . , Static
Resource ,
! Window:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
...
<Image Height="21" Source="zoom.gif"/>
...
</Window>

:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<Image x:Key="zoom" Height="21" Source="zoom.gif"/>
</Window.Resources>
<StackPanel>
<StaticResource ResourceKey="zoom"/>
</StackPanel>
</Window>

, Image, ,
XAML- ,
. Image
, Visual (, ,

408

12.

),

. , ,
StaticResource XAML-,
"Specified Visual is already a child of another
Visual or the root of a CompositionTarget" ( Visual
Visual
CompositionTarget).


XAML-
XAML-
,
XAML-.
XAML- ,
( ,
), MergedDictionaries
ResourceDictionary.
, Window
Resources, , :
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="file1.xaml"/>
<ResourceDictionary Source="file2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>

ResourceDictionary .
, file1.xaml :
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Image x:Key="logo" Source="logo.jpg"/>
</ResourceDictionary>

,
( ,
).
, XAML-
(. 20
).
#include,
C C++, XAML .

409


. StaticResource XAML
. ,
XAML-. ,
StaticResource ,
(
)! DynamicReso
urce .
- Window 12.2
Background .
, , .
DynamicResource ,
,
, :
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Simple Window" Background="{DynamicResource backgroundBrush}">
<Window.Resources>
<SolidColorBrush x:Key="backgroundBrush">Yellow</SolidColorBrush>
<SolidColorBrush x:Key="borderBrush">Red</SolidColorBrush>
</Window.Resources>
...
</Window>


, ,
. .

x:Shared="False",
,
.
,
Image (
, Visual).
,
. x:Shared="False"
,
. :
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<Image x:Shared="False" x:Key="zoom" Height="21" Source="zoom.gif"/>
</Window.Resources>
<StackPanel>
<!-- ! -->

410

12.

<StaticResource ResourceKey="zoom"/>
<StaticResource ResourceKey="zoom"/>
<StaticResource ResourceKey="zoom"/>
</StackPanel>
</Window>

, x:Shared
XAML-. XAML-
.


,
XAML-, ,
. . ,
Window window, SolidColorBrush,
12.2, C# :
window.Resources.Add("backgroundBrush", new SolidColorBrush(Colors.Yellow));
window.Resources.Add("borderBrush", new SolidColorBrush(Colors.Red));

.
StaticResource DynamicResource ,
C# .
, StaticResource,
FindResource (
FrameworkElement FrameworkContentElement).
, Button ( ,
12.2):
<Button Background="{StaticResource backgroundBrush}"
BorderBrush="{StaticResource borderBrush}"/>

C# ( , StackPanel,
Button, stackPanel):
Button button = new Button();
// , Button Window:
stackPanel.Children.Add(button);
button.Background = (Brush)button.FindResource("backgroundBrush");
button.BorderBrush = (Brush)button.FindResource("borderBrush");

FindResource , ,
TryFindResource,
null.
DynamicResource SetResourceReference
( FrameworkElement FrameworkContentElement)
.
, StaticResource Dyna
micResource:

411

<Button Background="{DynamicResource backgroundBrush}"


BorderBrush="{DynamicResource borderBrush}"/>

C#:
Button button = new Button();
button.SetResourceReference(Button.BackgroundProperty, "backgroundBrush");
button.SetResourceReference(Button.BorderBrushProperty, "borderBrush");

, Button -
Window (
). , StaticResource,
.
StaticResource
. FindResource TryFindResource
,
. , SetRe
sourceReference , .



,
,
. , Background BorderBrush
( , Window
window):
Button button = new Button();
button.Background = (Brush)window.Resources["backgroundBrush"];
button.BorderBrush = (Brush)window.Resources["borderBrush"];

StaticResource XAML
( FindResource ) ,
.
,
.
XAML ,
.
XAML .


,
DynamicResource, ,
System.Windows: Sys
temColors, SystemFonts SystemParameters. ,
,
.

412

12.

SystemColors, SystemFonts SystemParameters


,
, .
- Key. , SystemColors
Brush WindowBrush WindowTextBrush, Win
dowBrushKey WindowTextBrushKey ResourceKey.
.12.2
, .
, ,
.
12.2. ,

XAML:
<Button Background="SystemColors.WindowBrush"/>
C#:

.
BrushConverter

button.Background = (Brush)new
BrushConverter().ConvertFrom("SystemColors.WindowBrush");
XAML:
<Button Background="{x:Static SystemColors.WindowBrush}"/>
C#:
button.Background = SystemColors.WindowBrush;

XAML:
<Button Background=
"{StaticResource SystemColors.WindowBrushKey}"/>
C#:
button.Background =
(Brush)FindResource("SystemColors.WindowBrushKey");

XAML:
<Button Background=
"{StaticResource {x:Static SystemColors.WindowBrush}}"/>
C#:
button.Background =
(Brush)FindResource(SystemColors.WindowBrush);



,
,


,
Brush

"System
Colors.WindowBrush
Key",


,


SystemColors.Window
Brush

,

413

XAML:


.
<Button Background=
"{StaticResource {x:Static SystemColors.WindowBrushKey}}"/> , ,
,
C#:

button.Background =
(
(Brush)FindResource(SystemColors.WindowBrushKey);
),
,


XAML:

.
<Button Background=
"{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
,
C#:

,
button.SetResourceReference(

Button.BackgroundProperty, SystemColors.WindowBrushKey);


WPF, ,
, .
,
!
,
( , )
.
. ,
, ,
,
XAML-, .
, ,
,
(. 14).

Binding




: Twitter
XAML

13
13.

WPF
.NET.
, .
-, XML-, -,
, WPF, Button.

.NET.
(, ListBox DataGrid) ,
XML-, .

ListBoxItem ListBox, : ,
ListBox! - . ,
. , .
.

Binding
System.Win
dows.Data.Binding,
. Binding
.

Binding
, Photo Gallery,
, TextBlock,
, ListBox:

Binding

415

<TextBlock x:Name="currentFolder" DockPanel.Dock="Top"


Background="AliceBlue" FontSize="16" />


SelectedItem TreeView:
void treeView_SelectedItemChanged(object sender,
RoutedPropertyChangedEventArgs<object> e)
{
currentFolder.Text = (treeView.SelectedItem as TreeViewItem).Header.ToString();
Refresh();
}

, Binding,
, Main
Window:
public MainWindow()
{
InitializeComponent();
Binding binding = new Binding();
// -
binding.Source = treeView;
// -
binding.Path = new PropertyPath("SelectedItem.Header");
// -
currentFolder.SetBinding(TextBlock.TextProperty, binding);
}

currentFolder.Text
treeView.SelectedItem.Header.
TreeView , Header (
Photo Gallery ),
( - ) ,
( ). ,
.
,
!
.
, ,
.
Binding - -
. - ( treeView.SelectedItem.Header)
: - Source
( ,
), PropertyPath, Path.
Binding - ( currentFolder.
Text) Binding, SetBinding (

416

13.

FrameworkElement FrameworkContentElement),
Binding.

Binding
. SetBinding Framework
Element FrameworkContentElement, .
SetBinding BindingOperations.
, , ,
-:
BindingOperations.SetBinding(currentFolder, TextBlock.TextProperty, binding);

, Depen
dencyObject,
, FrameworkElement, FrameworkContentElement (,
Freezable).


Binding
, Binding
,
BindingOperations.ClearBinding. (,
.) - . :
BindingOperations.ClearBinding(currentFolder, TextBlock.TextProperty);

- Binding,
, BindingOperations.ClearAllBindings:
BindingOperations.ClearAllBindings(currentFolder);

-
, :
currentFolder.Text = "I am no longer receiving updates.";

. (
Binding .)
ClearBinding ,

( ,
..). , ,
, 3 WPF.
Binding, SetBinding, ,
, ClearBinding
, ClearValue
. ( ClearBinding
ClearValue -!)

Binding

417

Binding XAML
SetBinding XAML- , WPF
, Binding
. Binding
( , Extension).
Binding XAML, -
,
. ,

currentFolder:
<TextBlock x:Name="currentFolder" DockPanel.Dock="Top"
Text="{Binding ElementName=treeView, Path=SelectedItem.Header}"
Background="AliceBlue" FontSize="16" />

, ,
?
, .

Binding ,
Path. ,
-, Path ,
. , XAML
:
<TextBlock x:Name="currentFolder" DockPanel.Dock="Top"
Text="{Binding SelectedItem.Header, ElementName=treeView}"
Background="AliceBlue" FontSize="16" />

,
. ,
Path .

, XAML- -
ElementName, Source, .
, ElementName XAML,
-. ,
WPF4 x:Reference Source
:
<TextBlock x:Name="currentFolder" DockPanel.Dock="Top"
Text="{Binding Source={x:Reference TreeView}, Path=SelectedItem.Header}"
Background="AliceBlue" FontSize="16" />

418

13.

TargetNullValue Binding
, , -
null. ,
, Nothing is selected. ( )
, - null:
<TextBlock Text="{Binding ... TargetNullValue=Nothing is selected.}" .../>

TargetNullValue ,
- - null.


RelativeSource Binding
Relative
Source Binding, , . RelativeSource,
.
RelativeSource.
- -:
{Binding RelativeSource={RelativeSource Self}}

- TemplatedParent -
( ):
{Binding RelativeSource={RelativeSource TemplatedParent}}

- -
, :
{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type desiredType}}}

- n- , :
{Binding RelativeSource={RelativeSource FindAncestor,
AncestorLevel=n, AncestorType={x:Type desiredType}}}

- ,
:
{Binding RelativeSource={RelativeSource PreviousData}}

RelativeSource
, .
RelativeSource Self
.
Slider, ToolTip
:
<Slider ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Value}"/>

Binding

419

.NET
TreeView TextBox ,
. 3
,
. WPF
- -.
WPF
.NET . , ,
Photo Gallery Label,
.
Count (
Photos), Content Count :
<Label x:Name="numItemsLabel"
Content="{Binding Source={StaticResource photos}, Path=Count}"
DockPanel.Dock="Bottom"/>

( , ,
XAML Source. ElementName
,
FrameworkElement FrameworkContentElement!) .13.1
. , 54,
- 54 item(s). ,
item(s).
, .

.13.1.
photos.Count

.NET
.
,

. , , .13.1,
, , , .
, -
:
System.ComponentModel.INotifyPropertyChanged,
PropertyChanged.
XXXChanged, XXX ,
.

420

13.

, WPF .
( XXXChanged WPF
.) Photo Gallery
, photos INotifyPropertyChanged.
(Add, Remove, Clear,
Insert) PropertyChanged. , .NET Framework
, ! Observ
ableCollection. , photos.Count

public class Photos : Collection<Photo>

:
public class Photos : ObservableCollection<Photo>


.NET
-,
.NET, WPF . -
ICustomTypeDescriptor, WPF (,
, TypeDescriptionProvider,
), , Pro
pertyDescriptor .
, ,
(,
).

-!
-
.NET, - . -
. ,
( ) , .


-
-, , - ( Path
Binding) ! -
.
? .13.2 , .13.1,
Path:

Binding

421

<Label x:Name="numItemsLabel"
Content="{Binding Source={StaticResource photos}}"
DockPanel.Dock="Bottom"/>

.13.2.
photos

photos UIElement,
, ToString.
,
, , , ,
ListBox, .

, XAML-
, ,
, .
, Photo Gallery Popup,
zoomButton. Placement Place
mentTarget Popup,
UIElement. C# :
Button zoomButton = new Button();
...
Popup zoomPopup = new Popup();
zoomPopup.Placement = PlacementMode.Center;
zoomPopup.PlacementTarget = zoomButton;

Photo Gallery XAML-:


<Button x:Name="zoomButton" ... >
...
</Button>
<Popup PlacementTarget="{Binding ElementName=zoomButton}" Placement="Center" ...>
...
</Popup>

.
, x:Reference, WPF4,
Binding.

422

13.

UIElement!
- UIElement,
, ,
. , XAML-
InvalidOperationException "Specified element is already the
logical child of another element" (
):
<Label x:Name="one" Content="{Binding ElementName=two}"/>
<Label x:Name="two" Content="text"/>

, Label TextBlock
(, , Content Text):
<TextBlock x:Name="one" Text="{Binding ElementName=two}"/>
<Label x:Name="two" Content="text"/>

, Label.Content Object, TextBlock.Text


. , ,
ToString.
"System.Windows.Controls.Label: text", -
. Label Text
Block , (Label
Content).


photos.Count ,
ListBox (
Window) photos. Photo Gallery .
,
ListBox, ,
. ListBox
ListBoxItem .
,
- ( FileSystem
Watcher), ListBox.
,
.


Binding,
- ListBox.Items, , , Items
. ListBox,
ItemsSource,

Binding

423

. IEnumerable,
photos Binding :
<ListBox x:Name="pictureBox"
ItemsSource="{Binding Source={StaticResource photos}}" ...>
...
</ListBox>

- ( ), -
INotifyCollectionChanged.
ObservableCollection INotifyPropertyChanged
InotifyCollectionChanged , ,
Photos ObservableCollection<Photo>, ,
.
.13.3 .

.13.3. ListBox photos,



, pho
tos , ToString, .
DisplayMemberPath,
(. 10).
ItemsSource.
,
.

424

13.

Photo Gallery Photo,


, Name, DateTime Size. ,
XAML- , . 13.4,
, , .13.3:
<ListBox x:Name="pictureBox" DisplayMemberPath="Name"
ItemsSource="{Binding Source={StaticResource photos}}" ...>
...
</ListBox>

Photo ,
, ToString ,
Name .

.13.4. DisplayMemberPath
,

,
Photo Image DisplayMemberPath.
,
-. ( ,
- . ,
, WPF
!) (
) ,
.
.

Binding

425

Items ItemsSource ItemsControl


!
,
: Items
ItemsSource, .
ItemsSource ,
Items , Items , ItemsSource
null ( InvalidOperationException).
,
ListBox ,
- (ItemsSource),
( Items). , ,
,
Items.


10 , Selector,
ListBox, .
( ,
IEnumerable), WPF ,
-, ,
, .

/ ( , , )
, .
, true
IsSynchronizedWithCurrentItem ( ).
XAML- ListBox,

photos:
<ListBox IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"
ItemsSource="{Binding Source={StaticResource photos}}"></ListBox>
<ListBox IsSynchronizedWithCurrentItem="True" DisplayMemberPath="DateTime"
ItemsSource="{Binding Source={StaticResource photos}}"></ListBox>
<ListBox IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Size"
ItemsSource="{Binding Source={StaticResource photos}}"></ListBox>

IsSynchronizedWithCurrentItem="True"
-,
.
(, ,
!) .13.5 , . -
IsSynchronizedWithCurrentItem false,

426

13.


.
.

IsSynchronizedWithCurrentItem
!
Selector ( ,
SelectionMode ListBox Multiple Extended),
,
!

.13.5.

DataContext

- , , -
( photos).
- (
- , - )
. WPF
, Binding Source,
RelativeSource ElementName.
.
-, photos,
, -
DataContext -. (
, FrameworkElement FrameworkContentElement,
DataContext Object.) Binding,
- , WPF ,
null DataContext.

Binding

427

, Label ListBox
-, DataContext :
<StackPanel DataContext="{StaticResource photos}">
<Label x:Name="numItemsLabel"
Content="{Binding Path=Count}" .../>
...
<ListBox x:Name="pictureBox" DisplayMemberPath="Name"
ItemsSource="{Binding}" ...>
...
</ListBox>
...
</StackPanel>

DataContext ,
,
- :
parent.DataContext = photos;

XAML , {Binding},
, , -
-
, .

FAQ
- ,
Binding?
, . -
-, ,
. -
, , ,
.
, -
, , - .
Binding
. ,
, .
, ;
. (,
RelativeSource
, .)

428

13.


, - , ,
, .
.

, !
,
(
Photo Gallery). WPF
,
, ,
. :
, .


,
StringFormat Binding.
, WPF String.Format,
StringFormat (format) -
(args[0]). , {0}
-,
, {0:C}
, {0:P} , {0:X}
.
, .13.1 54 item(s),
54, TextBlock Bin
ding StringFormat:
<TextBlock x:Name="numItemsLabel"
Text="{Binding StringFormat={}{0} item(s),
Source={StaticResource photos}, Path=Count}"
DockPanel.Dock="Bottom"/>

{} ,
{ . (. 2
XAML),
. {} , Binding
( ) :
<TextBlock x:Name="numItemsLabel" DockPanel.Dock="Bottom">
<TextBlock.Text>
<Binding Source="{StaticResource photos}" Path="Count">
<Binding.StringFormat>{0} item(s)</Binding.StringFormat>
</Binding>
</TextBlock.Text>
</TextBlock>

429

StringFormat , - !
StringFormat ,
Binding , -
string. Content
Label , Object:
<Label x:Name="numItemsLabel"
Content="{Binding StringFormat={}{0} item(s),
Source={StaticResource photos}, Path=Count}"
DockPanel.Dock="Bottom"/>

Text TextBlock string,


.
Label TextBlock.
ContentStringFormat ( ).

, , {:
<TextBlock x:Name="numItemsLabel"
Text="{Binding StringFormat=Number of items: {0},
Source={StaticResource photos}, Path=Count}"
DockPanel.Dock="Bottom"/>

, N0,
. ,
Count 54, 54 item(s), Count 1001,
1,001 item(s) ( , en-US):
<TextBlock x:Name="numItemsLabel"
Text="{Binding StringFormat={}{0:N0} item(s),
Source={StaticResource photos}, Path=Count}"
DockPanel.Dock="Bottom"/>

System.Xaml {}
!
System.Xaml, WPF 4, , -
{}
. System.Xaml {}
(
),
. , XAML-
System.Xaml :
<TextBlock Text="{Binding StringFormat={}{0:C}}" />

430

13.

, System.Xaml
(, XAML-),
. ,

, , :
<TextBlock Text="{Binding StringFormat=\{0:C\}}" />

XXXStringFormat,
XXX . ,
ContentStringFormat, Content,
ItemStringFormat,
. .13.1 ,
.
13.1. , WPF

StringFormat

BindingBase

ContentStringFormat

ContentControl, ContentPresenter, TabControl

ItemStringFormat

ItemsControl, HierarchicalDataTemplate

HeaderStringFormat

HeaderedContentControl, HeaderedItemsControl,
DataGridColumn, GridViewColumn, GroupStyle

ColumnHeaderStringFormat

GridView, GridViewHeaderRowPresenter

Label TextBlock,
StringFormat Binding,
Label ContentStringFormat, Label
:
<Label x:Name="numItemsLabel" ContentStringFormat="{}{0} item(s)"
Content="{Binding Source={StaticResource photos}, Path=Count}"
DockPanel.Dock="Bottom"/>

. .13.6
ListBox
: :
<ListBox ItemStringFormat="{}{0:C}"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:Int32>-9</sys:Int32>
<sys:Int32>9</sys:Int32>
<sys:Int32>1234</sys:Int32>
<sys:Int32>1234567</sys:Int32>
</ListBox>

431


(USA)

.13.6. ListBox


,
.NET .
WPF ( DataTemp
late) . , ContentControl
ContentTemplate
Content, ItemsControl ItemTemplate,
.
.13.2. , XXXTemplate , XXXStringFormat.
13.2. DataTemplate

ContentTemplate

ContentControl, ContentPresenter, TabControl

ItemTemplate

ItemsControl, HierarchicalDataTemplate

HeaderTemplate

HeaderedContentControl, HeaderedItemsControl, DataGridRow,


DataGridColumn, GridViewColumn, GroupStyle

SelectedContentTemplate

TabControl

DetailsTemplate

DataGridRow

RowDetailsTemplate

DataGrid

RowHeaderTemplate

DataGrid

ColumnHeaderTemplate

GridView, GridViewHeaderRowPresenter

CellTemplate

DataGridTemplateColumn, GridViewColumn

CellEditingTemplate

DataGridTemplateColumn

DataTemplate,
. DataTemplate,
ItemsPanelTemplate, 10,
FrameworkTemplate. VisualTree,
FrameworkElement.
XAML, .

432

13.

DataTemplate ListBox Photo


Gallery. .13.4 .

ItemTemplate:
<ListBox x:Name="pictureBox"
ItemsSource="{Binding Source={StaticResource photos}}" ...>
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="placeholder.jpg" Height="35"/>
</DataTemplate>
</ListBox.ItemTemplate>
...
</ListBox>

.13.7 , . ,
- placeholder.jpg, -
!

.13.7. -

, Image ,
Source FullPath Photo? ,
!
( -).
ItemTemplate,
ItemsSource. ,
.13.8, :
<ListBox x:Name="pictureBox"
ItemsSource="{Binding Source={StaticResource photos}}" ...>

433

<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Path=FullPath}" Height="35"/>
</DataTemplate>
</ListBox.ItemTemplate>
...
</ListBox>

.13.8.

, ,
. ,
. ,

DataType .
, , DataTemplate Resources
Window,
, , ,
: , - .
DataTemplate Resources
Application, .

,
(, ListBox, ),
,

.

434

13.

DataTemplate
, XML-
, HierarchicalDataTemplate.
,
, , TreeView Menu.
XmlDataProvider
HierarchicalDataTemplate XML-.




.
, WPF ,
, (
) ,
. , Data
TemplateSelector, SelectTemplate.
,
XXXTemplateSelector.
XXXTemplate, .13.2,
XXXTemplateSelector (.13.3).

13.3. ,

ContentTemplateSelector

ContentControl, ContentPresenter, TabControl

ItemTemplateSelector

ItemsControl, HierarchicalDataTemplate

HeaderTemplateSelector

HeaderedContentControl, HeaderedItemsControl,
DataGridRow, DataGridColumn, GridViewColumn,
GroupStyle

SelectedContentTemplateSelector TabControl
DetailsTemplateSelector

DataGridRow

RowDetailsTemplateSelector

DataGrid

RowHeaderTemplateSelector

DataGrid

ColumnHeaderTemplateSelector

GridView, GridViewHeaderRowPresenter

CellTemplateSelector

DataGridTemplateColumn, GridViewColumn

CellEditingTemplateSelector

DataGridTemplateColumn



-,

435

, ,
. ,
.
,
. ,
,
Brush, ,
Microsoft Excel.
, .
.


, ( Background)
photos (
Count). ,
Background , Brush:
<Label Background="{Binding Path=Count, Source={StaticResource photos}}" .../>

,
Converter:
<Label Background="{Binding Path=Count, Converter={StaticResource myConverter},
Source={StaticResource photos}}" .../>

, ,
Brush, :
<Window.Resources>
<local:CountToBackgroundConverter x:Key="myConverter"/>
</Window.Resources>

CountToBackgroundConverter,
IValueConverter ( System.Win
dows.Data). : Convert,
-, -, Con
vertBack, .
, C# CountToBackgroundConverter
:
public class CountToBackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (targetType != typeof(Brush))
throw new InvalidOperationException("The target must be a Brush!");
// , Parse
int num = int.Parse(value.ToString());

436

13.

return (num == 0 ? Brushes.Yellow : Brushes.Transparent);


}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}

Convert .
, Brush
es.Yellow, , Brushes.Transparent
. ( , ,
.) ConvertBack ,
. VI
, ConvertBack. .13.9
.

.13.9.
, photos


. CountToBack
groundConverter, , , IntegerToBrushConverter,
, ,
Brush. ,
, . (,
, - Foreground (
) Transparent ()!) , ,
.

IValueConverter parameter cultu


re. parameter null, culture Language
-. ( FrameworkElement
FrameworkContentElement, ,
) "en-US" (
).
Binding.ConverterParameter Binding.Converter

437

Culture. , Brushes.Yellow
CountToBackgroundConverter.Convert,
:
return (num == 0 ? parameter : Brushes.Transparent);

, parameter :
<Label Background="{Binding Path=Count, Converter={StaticResource myConverter},
ConverterParameter=Yellow, Source={StaticResource photos}}" Content="..." />

ConverterParameter "Yellow" ,
.
, "Yellow" ,
ConverterParameter (Object). , Convert
"Yellow", Brush. Convert
parameter , , num ,
.
, Back
ground Label .
ConverterCulture ,
(IETF),
"ko-KR", CultureInfo.

WPF
. BooleanTo
VisibilityConverter Visibility (
Visible, Hidden, Collapsed) Boolean,
null (). true
Visible, false null Collapsed. Visible
true, Hidden Collapsed false.

. , XAML-
Show Status Bar ( )
:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="booltoVis"/>
</Window.Resources>
...
<CheckBox x:Name="checkBox">Show Status Bar</CheckBox>
...
<StatusBar Visibility="{Binding ElementName=checkBox, Path=IsChecked,
Converter={StaticResource booltoVis}}">...</StatusBar>

StatusBar ,
IsChecked CheckBox true.

438

13.

!
, WPF
,
, ,
( ).
, ,
. Visual Studio
Output (). Visual Studio 2010 Ultimate
IntelliTrace.
(
Background photos.Count)
:
System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid
for target property.; Value='39' BindingExpression:Path=Count; DataItem='Photos'
(HashCode=58961324); target element is 'Label' (Name='numItemsLabel'); target
property is 'Background' (type 'Brush')

, - (
) ,
!
System.Diagnostics.Tra
ceSource,
. (Mike Hillberg), WPF,
http://blogs.msdn.com/mikehillberg/archi
ve/2006/09/14/WpfTraceSources.aspx. ,
WPF (
), ,
, .
PresentationTraceSources.TraceLevel (
System.Diagnostics WindowsBase),
Binding
, .
PresentationTraceLevel: None, Low, Medium,
High.


,
.
Content numItemsLabel Count photos (.
. 13.1), ,
, , .
StringFormat,
, item(s). ( , ,
1 item(s) .)

439

,
1 item ( ), 2 items (
). RawCountToDescriptionConverter:
public class RawCountToDescriptionConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
// , Parse
int num = int.Parse(value.ToString());
return num + (num == 1 ? " item" : " items");
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}

, ,

(, ,
culture).


, .
-

- ,
IValueConverter.

,
, Binding.DoNothing.
, null, null
-.
Binding.DoNothing : ,
, Binding .
- ,
(, ..). Binding.DoNothing
Convert ConvertBack,
Binding (, ClearBinding),
-.

440

13.

FAQ

, ?
ItemTemplate ItemsControl,
Binding,
.
Binding ItemsControl, -
Convert (
). ,
,
.


, , ,
( IsSynchronizedWithCurrentItem
true) , ,
-,
. ,
, (
!). -
,
?
. ( ,
IEnumerable),
. (
, ICollectionView)
, ,
, .
, ,
-.

-,
. (,
) .

ICollectionView SortDescriptions,
.

441

, ,
, (, Name,
DateTime Size Photo), ,
: .
SortDescription,
ListSortDirection. :
SortDescription sort = new SortDescription("Name", ListSortDirection.Ascending);

SortDescriptions SortDescription.
,
. SortDescription
, .
, SortDescrip
tion, DateTime ,

, Name (
):
view.SortDescriptions.Add(new SortDescription("DateTime",
ListSortDirection.Descending));
view.SortDescriptions.Add(new SortDescription("Name",
ListSortDirection.Ascending));

SortDescriptions Clear,
. ,
, , , !
13.1 , Photo Gallery
Name, DateTime Size,
. Windows,
.
13.1.
// Click :
void sortByName_Click(object sender, RoutedEventArgs e)
{
SortHelper("Name");
}
void sortByDateTime_Click(object sender, RoutedEventArgs e)
{
SortHelper("DateTime");
}
void sortBySize_Click(object sender, RoutedEventArgs e)
{
SortHelper("Size");
}
void SortHelper(string propertyName)

442

13.

{
//
ICollectionView view = CollectionViewSource.GetDefaultView(
this.FindResource("photos"));
// ,
//
if (view.SortDescriptions.Count > 0
&& view.SortDescriptions[0].PropertyName == propertyName
&& view.SortDescriptions[0].Direction == ListSortDirection.Ascending)
{
// ,
//
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription(
propertyName, ListSortDirection.Descending));
}
else
{
//
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription(
propertyName, ListSortDirection.Ascending));
}
}

, ListBox,
. , ,
- photos,
CollectionViewSource.GetDefaultView.
-
,
.



,
ICollectionView.SortDescriptions ( ),
.
IList ( ), ICollec
tionView, CollectionViewSource.GetDefaultView,
ListCollectionView. ICol
lectionView ListCollectionView, ,
IComparer, CustomSort.
ICom
parer.Compare. Compare
.

443

ICollectionView GroupDescriptions,
, SortDescriptions.
PropertyGroupDescription
, , .
, photos
DateTime:
//
ICollectionView view = CollectionViewSource.GetDefaultView(
this.FindResource("photos"));
//
view.GroupDescriptions.Clear();
view.GroupDescriptions.Add(new PropertyGroupDescription("DateTime"));

, , ,
,
. ,
GroupStyle GroupStyle.
HeaderTemplate,
, .
ListBox Photo Gallery
GroupStyle:
<ListBox x:Name="pictureBox"
ItemsSource="{Binding Source={StaticResource photos}}" ...>
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1">
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold"/>
</Border>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
...
</ListBox>


.
CollectionViewGroup, .
, ,
Name, , .
, ,
Name . .13.10

444

13.

XAML-
.

,
, ,
GroupStyle, WPF.
GroupStyle.Default XAML
:
<ListBox x:Name="pictureBox"
ItemsSource="{Binding Source={StaticResource photos}}" ...>
<ListBox.GroupStyle>
<x:Static Member="GroupStyle.Default"/>
</ListBox.GroupStyle>
...
</ListBox>

.13.10. ListBox

, , , ,
Photo.DateTime .
DateTime , , ,
, !
,
PropertyGroupDescription,
, .

445

. ,
DateTimeToDateConverter, DateTime
, :
public class DateTimeToDateConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
return ((DateTime)value).ToString("MM/dd/yyyy");
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}


DateTime. , ,
Convert DateTime:
return ((DateTime)value).Date;

,
,
.. (,
.)
,
:
//
ICollectionView view = CollectionViewSource.GetDefaultView(
this.FindResource("photos"));
//
view.GroupDescriptions.Clear();
view.GroupDescriptions.Add(
new PropertyGroupDescription("DateTime", new DateTimeToDateConverter()));

.13.11.
,
. .
SortDescription ,
. , (
), ,
( ), ,
.

446

13.

.13.11. ,
Photo.DateTime

, .
PropertyGroupDescription,
null. value
- ( Photo
Photo Gallery), .


ICollectionView ,
,
. Filter Predicate<Object> ( ,
, Object
).
Filter null ( ),
-. ,
.
, ( true),
( false).
C# .
, Photo,
DateTime , 7 :

447

ICollectionView view = CollectionViewSource.GetDefaultView(this.FindResource


("photos"));
view.Filter = delegate(object o) {
return ((o as Photo).DateTime DateTime.Now).Days <= 7;
};

-,
:
ICollectionView view = CollectionViewSource.GetDefaultView(this.FindResource
("photos"));
view.Filter = (o) => { return ((o as Photo).DateTime DateTime.Now).Days <= 7;};

, view.Filter null.

,
, 7
. ICollectionView
CurrentItem ( CurrentPosition,
, ),
CurrentItem. Photo Gallery

Click Next Photo ( ) Previous Photo (
):
void previous_Click(object sender, RoutedEventArgs e)
{
//
ICollectionView view = CollectionViewSource.GetDefaultView(
this.FindResource("photos"));
//
view.MoveCurrentToPrevious();
// ,
if (view.IsCurrentBeforeFirst) view.MoveCurrentToLast();
}
void next_Click(object sender, RoutedEventArgs e)
{
//
ICollectionView view = CollectionViewSource.GetDefaultView(
this.FindResource("photos"));
//
view.MoveCurrentToNext();
// ,
if (view.IsCurrentAfterLast) view.MoveCurrentToFirst();
}

448

13.

, .

ListBox, ,
, ,
. , - -
, CurrentItem null, CurrentPosition -1.
, ListBox.
, CurrentPosition ,
CurrentItem .

, Binding,
. ,
Binding
, :
"{Binding Path=/}"

Binding DateTime :
"{Binding Path=/DateTime}"

Binding ,
Photos ,
:
"{Binding Path=Photos/}"

, Binding DateTime
:
"{Binding Path=Photos/DateTime}"

/
.

!
, ,
, IsSynchronizedWithCur
rentItem true. SelectedItem
CurrentItem
. WPF ,

, ,
. , ,

.

449


, ,
,
-. ,
-
. , CollectionViewSource
,
.
.
photos
Photo Gallery, :
CollectionViewSource viewSource = new CollectionViewSource();
viewSource.Source = photos;
// viewSource.View
// ICollectionView,

CollectionViewSource ,
,
XAML-:
<Window.Resources>
<local:Photos x:Key="photos"/>
<CollectionViewSource x:Key="viewSource" Source="{StaticResource photos}"/>
</Window.Resources>

-,
CollectionViewSource,
-, :
<ListBox x:Name="pictureBox"
ItemsSource="{Binding Source={StaticResource photos viewSource}}" ...>
...
</ListBox>

, Collection
ViewSource, WPF CollectionViewSource ,
Path Binding. ,
Count -
Photos, CollectionViewSource.
ListBox , ,
,
.
, , ,
ICollectionView Collection
ViewSource.GetDefaultView, CollectionViewSource.

XAML, CollectionViewSource
SortDescriptions GroupDescriptions,

450

13.

, ICollectionView. ,
Filter, ,
, XAML-. (,
.)
, , XAML
:

<CollectionViewSource x:Key="viewSource" Filter="viewSource_Filter"


Source="{StaticResource photos}">
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="DateTime" Direction="Descending"/>
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>

<PropertyGroupDescription PropertyName="DateTime"/>
</CollectionViewSource.GroupDescriptions>

</CollectionViewSource>

SortDescription .NET,
XML,
:
xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase"

viewSource_Filter, XAML,
, ; -
:
void viewSource_Filter(object sender, FilterEventArgs e)
{
e.Accepted = ((e.Item as Photo).DateTime DateTime.Now).Days <= 7;
}

, - ,
e.Item.
,
e.Accepted , .

-
,
CollectionViewSource ,
!

451

FAQ

( CollectionViewSource),
?
.
. ,
, , , , ,
.

-!

;
, IsSynchronized
WithCurrentItem false. ,
!
IsSynchronizedWithCurrentItem false, WPF
true, ItemsSource
,
( SelectionMode
Single). , , ,
,
. (- ,
IsSynchronizedWithCurrentItem true
.)


- .NET, ,
,
, Windows, Excel ..
.NET,
! (
,
.)
, WPF
,
: XmlDataProvider ObjectDataProvider.

452

13.

WPF3.5 SP1
Language Integrated Query (LINQ).
Source Binding ( DataContext ) LINQ-
IEnumerable ,
. , LINQ to SQL, LINQ to XML
,
LINQ, WPF,
, XML- ..

XmlDataProvider
XmlDataProvider XML-
, . 13.2
XmlDataProvider XML-
:
13.2. XML-
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="XML Data Binding">
<Window.Resources>
<XmlDataProvider x:Key="dataProvider" XPath="GameStats">
<x:XData>
<GameStats xmlns="">
<! >
<GameStat Type="Beginner">
<HighScore>1203</HighScore>
</GameStat>
XML
<GameStat Type="Intermediate">
<HighScore>1089</HighScore>
</GameStat>
<GameStat Type="Advanced">
<HighScore>541</HighScore>
</GameStat>
</GameStats>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<Grid>

<ListBox ItemsSource="{Binding Source={StaticResource dataProvider},


XML
XPath=GameStat/HighScore}" />
</Grid>
</Window>

XmlDataProvider
XML-, XData;

453

, XAML-.
( XData, .)
XPath XmlDataProvider XPath-,
, XML. XPath (
XML Path Language) W3C http://www.w3.
org/TR/xpath.

XML- XAML-,
xmlns, 13.2.
,
( http://schemas.microsoft.com/winfx/2006/xaml/presen
tation), XPath- , .

XmlDataProvider ,
, ,
Path Binding,
XPath. 13.2 XPath
HighScore ListBox,
.13.12.

.13.12. XML-
13.2

XML- ( ),
Source XmlDataProvider
(URI),
. URI, ,
, , ..
13.2 XmlDataProvider :
<XmlDataProvider x:Key="dataProvider" XPath="GameStats" Source="GameStats.xml"/>

XPath , ,
. , 13.2
XPath "GameStat/@Type",
ListBox Type GameStat (Beginner, Interme
diate Advanced). "comment()",
XML-!

454

13.


XPath Path
XPath Path
Binding. XML- XmlDataProvider ,
System.Xml.dll ( System.Xml),
XmlNode. ,
, , Path Binding
XmlNode XmlNodeList. ,
OuterXml XmlNode
Label <HighScore>1203</HighScore>,
1203:
<Label Content="{Binding Source={StaticResource dataProvider},
XPath=GameStat/HighScore, Path=OuterXml}"/>

DisplayMemberPath ItemsControl
Path, XPath.

XML- ,
(TreeView Menu) ,
HierarchicalDataTemplates.
13.3, 13.2,
( HierarchicalDataTemplates
DataTemplate), ListBox TreeView, XPath
XML-.
13.3. HierarchicalDataTemplate
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="XML Data Binding">
<Window.Resources>
<HierarchicalDataTemplate DataType="GameStats"
ItemsSource="{Binding XPath=*}">
<TextBlock FontStyle="Italic" Text="All Game Stats"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="GameStat" ItemsSource="{Binding XPath=*}">
<TextBlock FontWeight="Bold" FontSize="20" Text="{Binding XPath=@Type}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="HighScore">
<TextBlock Foreground="Blue" Text="{Binding XPath=.}"/>
</DataTemplate>
<XmlDataProvider x:Key="dataProvider" XPath="GameStats">
<x:XData>
<GameStats xmlns="">
<!-- -->
<GameStat Type="Beginner">
<HighScore>1203</HighScore>
</GameStat>

455


<GameStat Type="Intermediate">
<HighScore>1089</HighScore>
</GameStat>
<GameStat Type="Advanced">
<HighScore>541</HighScore>
</GameStat>
</GameStats>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<Grid>
<TreeView ItemsSource="{Binding Source={StaticResource dataProvider},
XPath=.}" />
</Grid>
</Window>

, HierarchicalDataTemplate
, DataTemp
late .
, HierarchicalDataTemplate
ItemsSource.
HierarchicalDataTemplates 13.3
ItemsSource XPath *,
XML-.
DataType
(
Window). XmlDataProvider
DataType XML. ,
,
ResourceDictionary. ,
DataType.
.13.13 XAML- 13.3.
, , TreeView Menu,
.

TreeView 13.3

TreeView Menu

.13.13. HierarchicalDataTemplate
TreeView
Menu ,

456

13.

XML- .
, RSS- Twitter :
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:georss="http://www.georss.org/georss">
...
</rss>

(, atom:link)
XPath, XmlNamespaceManager
XmlDataProvider Binding. :
<XmlDataProvider Source="http://twitter.com/statuses/user_timeline/24326956.rss"
XmlNamespaceManager="{StaticResource namespaceMapping}"
XPath="rss/channel" x:Key="dataProvider"/>

XmlNamespaceManager
, XmlNamespaceMapping
Collection, . :
<XmlNamespaceMappingCollection x:Key="namespaceMapping">
<XmlNamespaceMapping Uri="http://www.w3.org/2005/Atom" Prefix="atom"/>
<XmlNamespaceMapping Uri="http://www.georss.org/georss" Prefix="georss"/>
</XmlNamespaceMappingCollection>

,
XML, ,
. XPath,
:
"{Binding XPath=atom:link}"

XPath ,
. , XML-
, XmlNamespaceManager,
.

ObjectDataProvider
XmlDataProvider XML, ObjectDataProvider .NET.
! .
.NET . ObjectDataProvider?
,
. , :
-

457



,
, .
WPF :
Binding IsAsync, XmlDataProvider ObjectDataProvider
IsAsynchronous. ( , ?)
IsAsynchronous true, -
. IsAsynchronous false ObjectDataProvider,
true XmlDataProvider (
XML-, RSS-,
). , IsAsync (
false) true,
-.
Binding.IsAsync ,
- .
:
, ..
, WPF
IsAsync.
IsAsync
, , .
, Recompute,
( , )
. ,
PropertyChanged.
, .

XAML
, ,
, .
photos, . XAML-
ObjectDataProvider:
<Window.Resources>
<local:Photos x:Key="photos"/>
<ObjectDataProvider x:Key="dataProvider"
ObjectInstance="{StaticResource photos}"/>
</Window.Resources>

, : photos dataPro
vider. . Path Binding
, Binding ,
, ObjectDataProvider.

458

13.

ObjectDataProvider ,
( ),
:
<Window.Resources>
<!-- ObjectDataProvider : -->
<ObjectDataProvider x:Key="dataProvider" ObjectType="{x:Type local:Photos}"/>
</Window.Resources>

ObjectDataProvider ,
.
ConstructorParameters .
, Photos , Object
DataProvider :
<ObjectDataProvider x:Key="dataProvider" ObjectType="{x:Type local:Photos}">
<ObjectDataProvider.ConstructorParameters>
<sys:Int32>23</sys:Int32>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>

x:Arguments
XAML2009, XAML2006 . ,
,
. ( , ,
, .) ,
XAML-,

, XAML.


, ObjectDataProvider ,
,
. ,
,
.

. ,
photos GetFolderName, ,
.
:
<ObjectDataProvider x:Key="dataProvider" ObjectType="{x:Type local:Photos}"
MethodName="GetFolderName"/>

,
MethodParameters ObjectDataProvider (
, ConstructorParameters). ,
ObjectDataProvider:
<TextBlock Text="{Binding Source={StaticResource dataProvider}}"/>

459

Path ,
.




ObjectDataProvider, ,
true BindsDirectlyToSource Binding
.
, DataSourceProvider ( Collection
ViewSource), ObjectDataProvider, XmlDataProvider
, .


,
.
,

, .



.
-, ,
. Binding
Mode,
, BindingMode:
OneWay .
TwoWay
.
OneWayToSource OneWay.
, .
OneTime , OneWay ,
.
.
TwoWay DataGrid
, TextBox, ,
.
OneWay,
, TextBox.Text, TwoWay. (
,

460

13.

, TwoWay .
,

.)

BindingMode, !
,
BindingMode , . ,
Label.Content, TextBox.Text Count
, BindingMode OneWay
( OneTime), Count , Two
Way OneWayToSource , - .

,
: Convert ConvertBack. (TwoWay)
, OneWayToSource ConvertBack.

FAQ
OneWayToSource?
, ,
.
, ,
,
. ,
,
.
OneWayToSource
, -
. -,
, -,
, OneWayToSource ,
, !

TwoWay OneWayToSource
, . ,
TextBox, TwoWay,
:
? Binding
UpdateSourceTrigger.

461

UpdateSourceTrigger ,
UpdateSourceTrigger:
PropertyChanged .
LostFocus , -
( , ).
Explicit Binding
Expression.UpdateSource. BindingExpression
, BindingOperations.GetBindingExp
ression GetBindingExpression ,
FrameworkElement FrameworkContentElement.
UpdateSourceTrigger
, Mode. , TextBox.Text
LostFocus.




, 3.
, GetMetadata
(, TextBox.TextProperty.GetMetadata()),
, BindsTwoWayByDefault DefaultUpdateSourceTrigger. ,
, ,
, .NET Reflector.

/
,
. , -
, .
, FrameworkElement FrameworkContentElement
SourceUpdated TargetUpdated, .
,
NotifyOnSourceUpdated ( NotifyOnTargetUpdated) Binding
true.


,
. - ,
,

462

13.

,
! ,
,
.
,
.
, ,
JPG- TextBox.
:
.jpg. TextBox ,
, ,
.
, -
. ,
, .
,
,
.
. -,
, -,
, , ,
.


. , ,
BindingMode OneWayToSource TwoWay.


Binding ValidationRules,
, ValidationRule.
- ,
. ,
, JpgValidation
Rule, ValidationRule,
Validate:
public class JpgValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
string filename = value.ToString();

463

// :
if (!File.Exists(filename))
return new ValidationResult(false, "Value is not a valid file.");
// , .jpg:
if (!filename.EndsWith(".jpg", StringComparison.InvariantCultureIgnoreCase))
return new ValidationResult(false, "Value is not a .jpg file.");
// !
return new ValidationResult(true, null);
}
}

, , , false
ValidationResult; ,
true. ( ".jpg"
,
JPEG, .)
Binding:
<TextBox>
<TextBox.Text>
<Binding ...>
<Binding.ValidationRules>
<local:JpgValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

(
, TextBox ,
UpdateSourceTrigger LostFocus).
( ),
.
, ?
-
. .

Validation.ErrorTemplate,
-. (
.)
, , , ,
.
, , Validation.
HasError, -, true
Validation.Error ( ,
NotifyOnValidationError Binding true).

464

13.

, ,
.
, ,
JpgValidationRule, -
Validation.Errors. ,
.



, ( )
, .
-
, ,
ExceptionValidationRule. :
<TextBox>
<TextBox.Text>
<Binding ...>
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

ExceptionValidationRule ,
- .
,
, , .
,
System.ComponentModel.IDataErrorInfo
(
Windows Forms), DataError
ValidationRule .
TextBox :
<TextBox>
<TextBox.Text>
<Binding ...>
<Binding.ValidationRules>
<ExceptionValidationRule/>
<DataErrorValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

,
, ,

465

WPF ,
. WPF3.5 SP1 Binding
ValidatesOnExceptions ValidatesOnDataErrors,
ValidationRules
, . , XAML-
:
<TextBox>
<TextBox.Text>
<Binding ValidatesOnExceptions="True" ValidatesOnDataErrors="True" .../>
</TextBox.Text>
</TextBox>



,
, , UpdateSource
ExceptionFilter Binding. ,
- ,
Exception.
,
ValidationRule. UpdateSourceExceptionFilter
, , ,
ExceptionValidationRule.
, UpdateSourceException
Filter . Validation
Error,
ValidationError Validation.Errors , Validation.HasError true ,
, Validation.Error.

:
,
:
UpdateSourceExceptionFilter
.
ValidatesOnExceptions
ExceptionValidationRule, ErrorTemplate /
, Validation.Has
Error Validation.Error ( NotifyOnVa
lidationError true).
IDataErrorInfo,
ValidatesOnDataErrors
DataErrorValidationRule. ,

466

13.

,
.

Binding

, ,
DataGrid - ,
.
Binding
Group. Binding,
ValidationRule, Binding.
BindingGroup FrameworkElement (
FrameworkContentElement), BindingGroup ( ItemsCont
rol ItemBindingGroup,
, ItemsControl).
BindingGroup Binding,
DataContext, -.
BindingGroup Name,
Binding ;
BindingGroupName Name .
ValidationRule, Bind
ingGroup, Validate
BindingGroup. BindingGroup
, Items,
Binding , ValidationRule
,
. BindingGroup
( DataGrid),
IEditableObject.


WPF
. :
CompositeCollection
MultiBinding
PriorityBinding

CompositeCollection
CompositeCollection
/ .
,
, . XAML-
CompositeCollection, ,
photos, :

467

<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource photos}}"/>
<local:Photo .../>
<local:Photo .../>
</CompositeCollection>

photos CollectionContainer, Compo


siteCollection , .
photos CompositeCollec
tion, !

MultiBinding
MultiBinding Binding,
.
, WPF ,
. XAML ,
MultiBinding ,
ProgressBar, ,
, :
<ProgressBar ...>
<ProgressBar.Value>
<MultiBinding Converter="{StaticResource converter}">
<Binding Source="{StaticResource worker1}"/>
<Binding Source="{StaticResource worker2}"/>
<Binding Source="{StaticResource worker3}"/>
</MultiBinding>
</ProgressBar.Value>
</ProgressBar>

MultiBinding ,
Binding. IMultiValueConverter,
, .
:
public class ProgressConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
int totalProgress = 0;
// ,
// Worker
foreach (Worker worker in values)
totalProgress += worker.Progress;
return totalProgress;
}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, CultureInfo culture)

468

13.

{
return DependencyProperty.UnsetValue;
}
}

MultiBinding StringFormat.
{0} Binding, {1} ..

PriorityBinding
PriorityBinding MultiBinding ,
Binding. ,
!
(
),
, ,
.
. , Microsoft
Word
: 77257,
. 1/3 ( )
. 1/46. Photo Gallery
,

.
XAML- Priority
Binding:
<PriorityBinding>
<Binding Source="HighPri" Path="SlowSpeed" IsAsync="True"/>
<Binding Source="MediumPri" Path="MediumSpeed" IsAsync="True"/>
<Binding Source="LowPri" Path="FastSpeed"/>
</PriorityBinding>

Binding ,
(, , ),
(, , ).

.

: Twitter XAML

469

PriorityBinding Binding,
, IsAsync true,
.
(,
),
!

:
Twitter XAML
WPF
RSS-,
. 13.4
, RSS- Twitter.
Twitter, .13.14.
XAML- Kaxaml (http://ka
xaml.com), .
13.4. RSS-
( Twitter)
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="RSS Reader">
<Window.Resources>
<XmlDataProvider x:Key="Feed"
Source="http://twitter.com/statuses/user_timeline/24326956.rss"/>
</Window.Resources>
<DockPanel
DataContext="{Binding Source={StaticResource Feed},
XPath=/rss/channel/item}">
<TextBox DockPanel.Dock="Top" Text="{Binding Source={StaticResource Feed},
BindsDirectlyToSource=true, Path=Source,
UpdateSourceTrigger=PropertyChanged}"/>
<Label DockPanel.Dock="Top" Content="{Binding XPath=/rss/channel/title}"
FontSize="14" FontWeight="Bold"/>
<Label DockPanel.Dock="Top"
Content="{Binding XPath=/rss/channel/description}"/>
<ListBox DockPanel.Dock="Left" DisplayMemberPath="title"
ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" Width="300"/>
<Frame Source="{Binding XPath=link}"/>
</DockPanel>
</Window>

, RSS-
XmlDataProvider.

470

13.

.13.14. , RSS- Twitter,


XAML

:
Text TextBox
Source XmlDataProvider.
,
.
Source
, Binding TextBox BindsDirectlyToSource
true. Path RSS, .
TextBox Binding UpdateSourceTrigger
PropertyChanged,
. , Update
SourceTrigger=Explicit Go (),
.
, !
DisplayMemberPath ListBox
XPath, title ,
XML.
ListBox Frame /
.
Frame,
RSS- - TextBlock. HTML-
.

471

HTML,
Frame WebBrowser URL-
( link, ).
( )
.

,
. , ,
. ,
, ,
,
, .
-
, .
XmlDataProvider ,
, ,
XML- .
Binding

.

. WPF
,
. .
, Expression Blend,
( ),

. Blend

.
XAML-,
,
,
, .

14

14.

, ,

, WPF

, .
(CSS) HTML ,

, . HTML
, ,
SELECT (HTML-)?
, - ,
(, ).
,
WPF:

( CSS HTML).
, .
,
, WPF.

/ , .
,
.
, WPF
.

473

FAQ
WPF
?
!
WPF .

, (
BLINK HTML)?
, . WPF 2003,

, . , ,
, , .
WPF ,
,
. .
,
WPF-
Windows. Silverlight,
, Win
dows-. ,
WPF (
).
,
-,
,
Windows. (
), -, ,
.
Windows, .

,
.

, System.Windows.Style,
. ,
.
.
, , Button . 14.1.
.
,
, 14.1.

474

14. , ,

.14.1.

14.1. !
<StackPanel Orientation="Horizontal">
<Button FontSize="22" Background="Purple" Foreground="White"
Height="50" Width="50" RenderTransformOrigin=".5,.5">
<Button.RenderTransform>
<RotateTransform Angle="10"/>
</Button.RenderTransform>
1
</Button>
<Button FontSize="22" Background="Purple" Foreground="White"
Height="50" Width="50" RenderTransformOrigin=".5,.5">
<Button.RenderTransform>
<RotateTransform Angle="10"/>
</Button.RenderTransform>
2
</Button>
<Button FontSize="22" Background="Purple" Foreground="White"
Height="50" Width="50" RenderTransformOrigin=".5,.5">
<Button.RenderTransform>
<RotateTransform Angle="10"/>
</Button.RenderTransform>
3
</Button>
</StackPanel>


,
14.2. Style Setter,
. Setter
( ) .
, ,
,
.
. ,
buttonStyle ,
Resources Window - (
buttonStyle).
, , ,
. , ,
.
, .

475

14.2.
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style x:Key="buttonStyle">
<Setter Property="Button.FontSize" Value="22"/>
<Setter Property="Button.Background" Value="Purple"/>
<Setter Property="Button.Foreground" Value="White"/>
<Setter Property="Button.Height" Value="50"/>
<Setter Property="Button.Width" Value="50"/>
<Setter Property="Button.RenderTransformOrigin" Value=".5,.5"/>
<Setter Property="Button.RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>
</Setter>
</Style>
</StackPanel.Resources>
<Button Style="{StaticResource buttonStyle}" >1</Button>
<Button Style="{StaticResource buttonStyle}" >2</Button>
<Button Style="{StaticResource buttonStyle}" >3</Button>
</StackPanel>

! , Style
buttonStyle,
14.2. BasedOn, ,
:
<Style x:Key="buttonStyleWithBold" BasedOn="{StaticResource buttonStyle}">
<!-- , buttonStyle, -->
<Setter Property="Button.FontWeight" Value="Bold"/>
</Style>


Style
XAML- ( ),
, ,
14.2. Style ,
.


Style 14.2 ,

. 14.3

476

14. , ,

Button.XXX Style Control.XXX,


. .14.2.

.14.2.

14.3.

<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style x:Key="controlStyle">
<Setter Property="Control.FontSize" Value="22"/>
<Setter Property="Control.Background" Value="Purple"/>
<Setter Property="Control.Foreground" Value="White"/>
<Setter Property="Control.Height" Value="50"/>
<Setter Property="Control.Width" Value="50"/>
<Setter Property="Control.RenderTransformOrigin" Value=".5,.5"/>
<Setter Property="Control.RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>
</Setter>
</Style>
</StackPanel.Resources>
<Button Style="{StaticResource controlStyle}">1</Button>
<ComboBox Style="{StaticResource controlStyle}">
<ComboBox.Items>2</ComboBox.Items>
</ComboBox>
<Expander Style="{StaticResource controlStyle}" Content="3"/>
<TabControl Style="{StaticResource controlStyle}">
<TabControl.Items>4</TabControl.Items>
</TabControl>
<ToolBar Style="{StaticResource controlStyle}">
<ToolBar.Items>5</ToolBar.Items>
</ToolBar>
<InkCanvas Style="{StaticResource controlStyle}"/>
<TextBox Style="{StaticResource controlStyle}" Text="7"/>
</StackPanel>

, ,
- , ;
. , InkCanvas Foreground
FontSize. ,
14.3, InkCanvas (Background, Height, Width
..) .

477

Setter Style 14.3 TextBox,


, .14.2:
<Setter Property="TextBox.TextAlignment" Value="Right"/>


( ) Setter
, , , -
Setter 14.3 InkCanvas,
Control, InkCanvas Control!
(
, .NET).
InkCanvas
( DependencyProperty.Register), , Backg
round, (
DependencyProperty.AddOwner).
, ,
Setter.Property, ,
. ,
, .
.
, 14.3 Setter ,
14.2. Button.XXX, Control.
XXX, . ,
14.3 TextBlock, , Button.Fore
ground TextBlock, Button.Background
TextBlock! , TextBlock
Control Foreground,
Background. (Control Background
, Panel InkCanvas, TextBlock
, TextElement, FlowDocument .)

.

, ,
. , 14.3
, controlStyle,
, :
<Button Style="{StaticResource controlStyle}" Background="Red">1</Button>


, 3 WPF.
, .

478

14. , ,


, Style Resources.
,
, ,
- .


, -
, TargetType. ,
Button (
Button):
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
<Setter Property="Button.FontSize" Value="22"/>
<Setter Property="Button.Background" Value="Purple"/>
<Setter Property="Button.Foreground" Value="White"/>
<Setter Property="Button.Height" Value="50"/>
<Setter Property="Button.Width" Value="50"/>
<Setter Property="Button.RenderTransformOrigin" Value=".5,.5"/>
<Setter Property="Button.RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>
</Setter>
</Style>

, Button,
. , 14.3
TargetType="{x:Type Control}",
, InkCanvas.
, TargetType,

Setter. , XAML-
:
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="22"/>
<Setter Property="Background" Value="Purple"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Height" Value="50"/>
<Setter Property="Width" Value="50"/>
<Setter Property="RenderTransformOrigin" Value=".5,.5"/>
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>

479


</Setter>
</Style>


TargetType .
Key,
.
, ,
.
Style.
, Window.Resources,
Window. ,
, ,
.
<Application ...>
<Application.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="22"/>
<Setter Property="Background" Value="Purple"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Height" Value="50"/>
<Setter Property="Width" Value="50"/>
<Setter Property="RenderTransformOrigin" Value=".5,.5"/>
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
</Application>

x:Key !

.
,
- . ,
, Style null.


?
, , ResourceDictionary,
. .
TargetType (
Type, ). , Target
Type Button, :

480

14. , ,

<Button Style="{StaticResource {x:Type Button}}" .../>

TargetType ResourceDictionary
,
.
Style ,
:
[DictionaryKeyProperty("TargetType")]

DictionaryKeyPropertyAttribute
, ,
.

,
TargetType!
,
TargetType,
, TargetType. ,
. ,
ToggleButton , ,
CheckBox (, CheckBox ToggleButton).
(
, ). ,
,
.

. ,
, FrameworkElement FrameworkContentElement,
FocusVisualStyle Style. , Focus
VisualStyle, , ; ,

, ( ,
).

. , ItemsControl ItemContainer
Style, (, ListBoxItem
ComboBoxItem). , ToolBar,
ResourceKey, ,
ButtonStyleKey TextBoxStyleKey. XXXStyleKey
,
. :

481

<Application ...>
<Application.Resources>
<Style x:Key="{x:Static ToolBar.ButtonStyleKey}" TargetType="{x:Type Button}">
...
</Style>
</Application.Resources>
</Application>

, ToolBar ResourceKey,
Style, ,
.
ItemsControl , ItemCon
tainerStyle null,
. ToolBar
, .

, 3,
Setter , (/ Trigger
Action).
, .
, :

.

.NET.

.
FrameworkElement, Style, DataTemplate ControlTemplate (
) Triggers,
, Framework
Element . , Style
,
,
.

. 17 .


( Trigger)
Setter,
. ,
Setter.

482

14. , ,

, buttonStyle
, ;
, Foreground Black White:
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
</Style.Triggers>
<Setter Property="FontSize" Value="22"/>
<Setter Property="Background" Value="Purple"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Height" Value="50"/>
<Setter Property="Width" Value="50"/>
<Setter Property="RenderTransformOrigin" Value=".5,.5"/>
</Style>

.14.3 .
Foreground Black,
, Windows 7
.
Button, ,
Button (. ).
, Background .
IsMouseOver=false

IsMouseOver=true

.14.3.


.
JpgValidationRule Text
Box, JPG-.
, ,
, Validation.
HasError:
<Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>

483


<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>

,
ToolTip. ,
RelativeSource Validation.Errors
, .
TextBox, ,
, .14.4:
<TextBox Style="{StaticResource textBoxStyle}">
<TextBox.Text>
<Binding ...>
<Binding.ValidationRules>
<local:JpgValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

.14.4.

14.4
AlternationIndex ItemsControl,
10 .
ItemContainerStyle ItemsCont
rol , . (
, , , ListBox
ListBoxItem.) .14.5 .
14.4. ,
, ListBoxItem TreeViewItem
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Orientation="Horizontal">
<StackPanel.Resources>
<Style x:Key="AlternatingRowStyle" TargetType="{x:Type Control}">
<Setter Property="Background" Value="Green"/>

484

14. , ,

<Setter Property="Foreground" Value="White"/>


<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="White"/>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<ListBox AlternationCount="2" Margin="10" Width="200"
ItemContainerStyle="{StaticResource AlternatingRowStyle}">
<ListBoxItem>Item 1</ListBoxItem>
<ListBoxItem>Item 2</ListBoxItem>
<ListBoxItem>Item 3</ListBoxItem>
<ListBoxItem>Item 4</ListBoxItem>
<ListBoxItem>Item 5</ListBoxItem>
</ListBox>
<TreeView AlternationCount="2" Margin="10" Width="200"
ItemContainerStyle="{StaticResource AlternatingRowStyle}">
<TreeViewItem Header="Root 1" AlternationCount="2"
ItemContainerStyle="{StaticResource AlternatingRowStyle}">
<TreeViewItem Header="Subitem 1"/>
<TreeViewItem Header="Subitem 2"/>
<TreeViewItem Header="Subitem 3"/>
</TreeViewItem>
<TreeViewItem Header="Root 2" AlternationCount="2"
ItemContainerStyle="{StaticResource AlternatingRowStyle}">
<TreeViewItem Header="Subitem 1"/>
<TreeViewItem Header="Subitem 2"/>
<TreeViewItem Header="Subitem 3"/>
</TreeViewItem>
</TreeView>
</StackPanel>

.14.5. ListBox TreeView,


,
AlternationIndex 1,

485

, . ,

, AlternationCount 2 (
0, 1, 0, 1, ).
, ListBoxItem,
TreeViewItem, Control ( ,
),
ItemsControl.AlternationIndex, - (,
ListBox.AlternationIndex). , . 14.5,
TreeViewItem, , Alternation
Count 2, ItemContainerStyle
. , TreeViewItem (
) .


,
.NET, . (,
Setter -
.)
,
Triggers DataTrigger /.
.NET
Binding, .
TextBox ,
IsEnabled Text,
. Text "disabled", IsEnabled
false (,
):
<StackPanel Width="200">
<StackPanel.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger
Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}"
Value="disabled">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="Background"
Value="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
</Style>
</StackPanel.Resources>
<TextBox Margin="3"/>
</StackPanel>

Binding Text ;
Background TextBox

486

14. , ,

( Brush).
, ,
. (
Setter
, , .)
.14.6 Text.

.14.6. TextBox ,
"disabled"


:
=, .
:
(
).
(
).
. Style.Triggers
,
Setter
:
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="Black"/>

487

</Trigger>
</Style.Triggers>

: IsMouseOver true IsFocused true,


.




Setter, .
Setter .

. ,
Trigger MultiTrigger
DataTrigger MultiDataTrigger. MultiTrig
ger, MultiDataTrigger Conditions,
, Trigger DataTrigger.
, MultiTrigger :
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
<Condition Property="IsFocused" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="10"/>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="Black"/>
</MultiTrigger>
</Style.Triggers>

: IsMouseOver true IsFocused true,


. MultiDataTrigger ,
MultiTrigger, .NET.


, EventSetter (
, Setter),
, . EventSetter
, Setter:

488

14. , ,

<Style x:Key="buttonStyle" TargetType="{x:Type Button}">


<Setter Property="FontSize" Value="22"/>
<EventSetter Event="MouseEnter" Handler="Button_MouseEnter"/>
</Style>
,
,
.

, Control, ,
. Button
Background Foreground (
), TabControl -
TabStripPlacement ..
.
,
, ,
. , ( WPF)
;
WPF (
Windows).
( ).

, WPF
. ,
Expander .14.2,
.

Expander. Expander ArrowBrush ArrowColor,
Expander !
. ,
,
. ControlTemplate,
FrameworkTemplate. , FrameworkTemplate,
: DataTemplate ( ) ItemsPanelTemplate
(10).
.NET, ,
TextBlock,
, ToString. ItemsPanelTemplate
ItemsPanel , ItemsControl;
.

489


(!) ,
, .
.


ControlTemplate Visual
Tree, ,
. ControlTemplate ( , XAML),
Control Page, Temp
late. 14.5 ,
, Button.
.14.7 .
14.5. ControlTemplate
<Grid>
<Grid.Resources>
<ControlTemplate x:Key="buttonTemplate">
<Grid>
<Ellipse Width="100" Height="100">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="Blue"/>
<GradientStop Offset="1" Color="Red"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse Width="80" Height="80">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource buttonTemplate}">OK</Button>
</Grid>

, (
Ellipse), Grid
. , -
Click, IsDefault
. - Button!

490

14. , ,

.14.7. , ControlTemplate

14.5 Button -
. FrameworkElement Frame
workContentElement TemplatedParent
.


,
Triggers. 14.6 ControlTemplate

. Button.IsMouseOver
, Button.IsPressed ,
ScaleTransform, .
.14.8.
14.6. ControlTemplate,
<Grid>
<Grid.Resources>
<ControlTemplate x:Key="buttonTemplate">
<Grid>
<Ellipse x:Name="outerCircle" Width="100" Height="100">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="Blue"/>
<GradientStop Offset="1" Color="Red"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse Width="80" Height="80">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>

491


</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsMouseOver" Value="True">
<Setter TargetName="outerCircle" Property="Fill" Value="Orange"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX=".9" ScaleY=".9"/>
</Setter.Value>
</Setter>
<Setter Property="RenderTransformOrigin" Value=".5,.5"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Grid.Resources>
<Button Template="{StaticResource buttonTemplate}">OK</Button>
</Grid>

IsMouseOver=True

IsPressed=True

( IsMouseOver=True)

.14.8. ,
ControlTemplate 14.6

,
outerCircle. ,
. TargetName Set
ter ( ),
Fill Orange outerCircle.
TargetName, ,
, Button
Fill .
.
. Scale
Transform ( RenderTransform) ,
RenderTransformOrigin, .
.14.8 , ,
( 10%)
.

492

14. , ,

TargetName Setter Trigger (


EventTrigger Condition) SourceName,
,
. , IsMouseOver

.



x:Name
, .
x:Name . ,
.
,
( , XAML).
-
, FindName Template ,
.


Style, ControlTemplate TargetType,
. ,

(, Trigger.Property Setter.Pro
perty). , 14.6
:
<ControlTemplate x:Key="buttonTemplate" TargetType="{x:Type Button}">
<Grid>
...
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outerCircle" Property="Fill" Value="Orange"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX=".9" ScaleY=".9"/>
</Setter.Value>
</Setter>
<Setter Property="RenderTransformOrigin" Value=".5,.5"/>
</Trigger>

493

</ControlTemplate.Triggers>
</ControlTemplate>

, Proper
ty Setter .
, TargetName,
Control. (
TargetType Control.)
Style, TargetType
x:Key ( ).
,
; ,
.

-
, , .
, , ,
. ,
"OK",
. ,
, ,
.

Content ContentControl

. , TemplateBindingEx
tension .
,
Binding, ,
. TemplateBinding, Exten
sion XAML .
TemplateBinding ,
,
Property TemplateBinding. , 14.6
TextBlock,
Content Button:
<TextBlock Text="{TemplateBinding Property=Button.Content}"/>

, TemplateBinding ,
, :
<TextBlock Text="{TemplateBinding Button.Content}"/>

TargetType (
, ContentControl),
:

494

14. , ,

<TextBlock Text="{TemplateBinding Content}"/>

, ,
TextBlock
.
Content , TextBlock
ContentControl. 14.7 . ContentControl
Margin, Viewbox,
.
14.7. ControlTemplate,

<ControlTemplate x:Key="buttonTemplate" TargetType="{x:Type Button}">
<Grid>
<Ellipse x:Name="outerCircle" Width="100" Height="100">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="Blue"/>
<GradientStop Offset="1" Color="Red"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse Width="80" Height="80">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Viewbox>
<ContentControl Margin="20" Content="{TemplateBinding Content}"/>
</Viewbox>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outerCircle" Property="Fill" Value="Orange"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX=".9" ScaleY=".9"/>
</Setter.Value>
</Setter>
<Setter Property="RenderTransformOrigin" Value=".5,.5"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

.14.9 ,
. "OK",

495

Image.
.

.14.9. , 14.7

ContentControl,
ContentPresenter.
, ContentControl,
. ContentPresenter
, ContentControl
(, , ContentPresenter)!
14.7
<ContentControl Margin="20" Content="{TemplateBinding Content}"/>

:
<ContentPresenter Margin="20" Content="{TemplateBinding Content}"/>

ContentPresenter :
Content {TemplateBinding Content},
. :
<ContentPresenter Margin="20"/>

, TargetType
, ContentControl (, Button).
ContentPresenter
ContentControl, .

TemplateBinding
,
Freezable!
TemplateBinding
VisualTree, .
, TemplateBinding ,
Freezable. ,
Color Brush .

496

14. , ,

TemplateBinding ,
Binding. ,
Binding, RelativeSource {Relati
veSource TemplatedParent}, Path ,
. Binding ,
TemplateBinding .


,
, ,
: Height Width,
, Background, Padding .. (, Foreground, Font
Size, FontWeight )
,
.
14.8 14.7,
Background, Padding Content Button.
,
Height Width,
. 14.8 ContentPresenter ContentControl,
.
14.8. ControlTemplate,

<ControlTemplate x:Key="buttonTemplate" TargetType="{x:Type Button}">
<Grid>
<Ellipse x:Name="outerCircle">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0"
Color="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Background.Color}"/>
<GradientStop Offset="1" Color="Red"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse RenderTransformOrigin=".5,.5">
<Ellipse.RenderTransform>
<ScaleTransform ScaleX=".8" ScaleY=".8"/>
</Ellipse.RenderTransform>
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>

497

</Ellipse.Fill>
</Ellipse>
<Viewbox>
<ContentPresenter Margin="{TemplateBinding Padding}"/>
</Viewbox>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outerCircle" Property="Fill" Value="Orange"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX=".9" ScaleY=".9"/>
</Setter.Value>
</Setter>
<Setter Property="RenderTransformOrigin" Value=".5,.5"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

Padding Margin
ContentPresenter. Padding
Margin
. , , , !
,
,
Background. {TemplateBinding Backgro
und} Fill outerCircle,
, .. , ,
,
. ,
Background.
GradientStop.Color {Template
Binding Background}, Color, Background
Brush ( GradientStop Freezable)!
Binding,
Color. (, Binding ,
Background SolidColorBrush,
Color .)
( Grid)
Height Width,
.
ActualHeight ActualWidth. ,
-
! ,
, Width Height.

498

14. , ,

,
Viewbox.
, 14.8,
ScaleTransform , 80%
.
,
. , ScaleTransform
. ( ,
,
Margin.)
.14.10
:
<StackPanel Orientation="Horizontal">
<Button Template="{StaticResource buttonTemplate}"
Height="100" Width="100" FontSize="80" Background="Black"
Padding="20" Margin="5">1</Button>
<Button Template="{StaticResource buttonTemplate}"
Height="150" Width="250" FontSize="80" Background="Yellow"
Padding="20" Margin="5">2</Button>
<Button Template="{StaticResource buttonTemplate}"
Height="200" Width="200" FontSize="80" Background="White"
Padding="20" Margin="5">3</Button>
</StackPanel>

.14.10 Background, Padding


Content, . Height
Width , FontSize
ContentPresenter, .
,
ContentPresenter Viewbox,
. Margin, ,
, StackPanel,
.

.14.10. ,
14.8

499


TemplateBinding
Binding, TemplateBinding
. TemplateBinding Converter Converter
Parameter, , , ConverterCulture.
, Binding.



, , .
, 14.8 ,
.
? Button !
,
20 .
, Button,
HoverBrush. -
.
, . ,
.
- ,
- .

. ,
,
. ,
, Control, Brush: Back
ground, Foreground BorderBrush. Background Foreground
14.8,
, . ( ,
.)
BorderBrush . ,
?
,
, . ,
IsMouseOver 14.8,
BorderBrush:
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outerCircle" Property="Fill"
Value="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=BorderBrush}"/>
</Trigger>

500

14. , ,

Binding, TemplateBinding,
Trigger .
,
, -
! , ,
, ,
(,
).
,
. WPF
! , -
.




, . ,
, 14.8, CheckBox Toggle
Button ( TargetType).
Checked,
Unchecked Indeterminate,
!
14.8 Button!
, , IsEnabled
false, IsDefaulted true,
.
, -
,
.

.
, ProgressBar
, . 14.9
ProgressBar ( ),
.

Value -,
.
, IsEnabled IsIndeterminate
. .14.11 14.12
, :
<ProgressBar Foreground="{StaticResource foregroundBrush}" Width="100"
Height="100" Value="10" Template="{StaticResource progressPie}"/>

501

0%

10%

50%

75%

100%

.14.11. ProgressBar

IsEnabled=false

IsIndeterminate=true

.14.12. ProgressBar

foregroundBrush :
<LinearGradientBrush x:Key="foregroundBrush" StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="LightGreen"/>
<GradientStop Offset="1" Color="DarkGreen"/>
</LinearGradientBrush>

14.9. ProgressBar
<Application x:Class="WindowsApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WindowsApplication1"
StartupUri="Window1.xaml">
<Application.Resources>
<ControlTemplate x:Key="progressPie" TargetType="{x:Type ProgressBar}">
<!-- -->
<ControlTemplate.Resources>
<local:ValueMinMaxToPointConverter x:Key="converter1"/>
<local:ValueMinMaxToIsLargeArcConverter x:Key="converter2"/>
</ControlTemplate.Resources>
<!-- -->
<Viewbox>
<Grid Width="20" Height="20">
<Ellipse x:Name="background" Stroke="{TemplateBinding BorderBrush}"
StrokeThickness="{TemplateBinding BorderThickness}"
Width="20" Height="20" Fill="{TemplateBinding Background}"/>
<Path x:Name="pie" Fill="{TemplateBinding Foreground}">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="10,10" IsClosed="True">

502

14. , ,

<LineSegment Point="10,0"/>
<ArcSegment Size="10,10" SweepDirection="Clockwise">
<ArcSegment.Point>
<MultiBinding Converter="{StaticResource converter1}">
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Value"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Minimum"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Maximum"/>
</MultiBinding>
</ArcSegment.Point>
<ArcSegment.IsLargeArc>
<MultiBinding Converter="{StaticResource converter2}">
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Value"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Minimum"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Maximum"/>
</MultiBinding>
</ArcSegment.IsLargeArc>
</ArcSegment>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
</Viewbox>
<!-- -->
<ControlTemplate.Triggers>
<Trigger Property="IsIndeterminate" Value="True">
<Setter TargetName="pie" Property="Visibility" Value="Hidden"/>
<Setter TargetName="background" Property="Fill">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="Yellow"/>
<GradientStop Offset="1" Color="Brown"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="pie" Property="Fill">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="Gray"/>
<GradientStop Offset="1" Color="White"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>

503

</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Application.Resources>
</Application>

Viewbox, Grid
2020 .
Background, BorderBrush BorderThickness ,
( 10), . Path (
), - Foreground

MultiBinding ( ,
14.10). MultiBinding, TemplateBinding
Binding,
ProgressBar: Value, Minimum Maximum. ,
.14.12,
Brush ( IsIndeterminate ). ,
IsIndeterminate
, , ,
. ,
ProgressBar. , Orientation ,
, , ,
.

: 14.9 ,
Resources ControlTemplate. Style,
, FrameworkTemplate,
Resources. ,
.

14.10. , 14.9
public class ValueMinMaxToIsLargeArcConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
double value = (double)values[0];
double minimum = (double)values[1];
double maximum = (double)values[2];
// true, value 50%
return ((value * 2) >= (maximum - minimum));

504

14. , ,

}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
public class ValueMinMaxToPointConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
double value = (double)values[0];
double minimum = (double)values[1];
double maximum = (double)values[2];
// value 0 360
double current = (value / (maximum - minimum)) * 360;
// ,
// ArcSegment
if (current == 360)
current = 359.999;
// 90 , 0
current = current - 90;
//
current = current * 0.017453292519943295;
//
double x = 10 + 10 * Math.Cos(current);
double y = 10 + 10 * Math.Sin(current);
return new Point(x, y);
}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

.
IsLargeArc ArcSegment (. 14.9) true,
, false .
, ValueMinMaxToIsLargeArcConverter
ProgressBar
.

505

. Point
, .
Value (),
.

, 10,
(10,10).



,
.
, ,
. ,
WPF4
(Visual State Manager VSM),
Silverlight.
VSM ,
,
. , VSM
. , Expres
sion Blend .


WPF . ,


. .
ProgressBar PART_Indi
cator PART_Track, , Width (
Height ) PART_Indicator
( )
PART_Track, Value, Minimum
Maximum .
(. 14.9) , , .
, ProgressBar,
(
).
ComboBox Popup
PART_Popup,
DropDownClosed ComboBox.
TextBox PART_EditableTextBox,
ComboBox
, .

506

14. , ,

, Text

Box PasswordBox, PART_


ContentHost. ,
!

FrameworkElement, ,
. .14.1
, WPF
. ,
, (, TextBox PasswordBox
PART_ContentHost TextBoxBase).
14.1. , WPF

Calendar

PART_CalendarItem
PART_Root

CalendarItem
Panel

CalendarItem

DayTitleTemplate
PART_DisabledVisual
PART_HeaderButton
PART_MonthView
PART_NextButton
PART_PreviousButton
PART_Root
PART_YearView

DataTemplate
FrameworkElement
Button
Grid
Button
Button
FrameworkElement
Grid

ComboBox

PART_EditableTextBox
PART_Popup

TextBox
Popup

DataGridColumnFloatingHeader

PART_VisualBrushCanvas

Canvas

DataGridColumnHeader

PART_LeftHeaderGripper
PART_RightHeaderGripper

Thumb
Thumb

DataGridColumnHeadersPresenter

PART_FillerColumnHeader

DataGridColumnHeader

DataGridRowHeader

PART_BottomHeaderGripper
PART_TopHeaderGripper

Thumb
Thumb

DatePicker

PART_Button
PART_Popup
PART_Root
PART_TextBox

Button
Popup
Grid
DatePickerTextBox

DatePickerTextBox

PART_Watermark

ContentControl

DocumentViewer

PART_ContentHost
PART_FindToolBarHost

ScrollViewer
ContentControl

507

DocumentViewerBase

PART_FindToolBarHost

Decorator

FlowDocumentReader

PART_ContentHost
PART_FindToolBarHost

Decorator
Decorator

FlowDocumentScrollViewer

PART_ContentHost
PART_FindToolBarHost
PART_ToolBarHost

ScrollViewer
Decorator
Decorator

Frame

PART_FrameCP

ContentPresenter

GridViewColumnHeader

PART_FloatingHeaderCanvas
PART_HeaderGripper

Canvas
Thumb

MenuItem

PART_Popup

Popup

NavigationWindow

PART_NavWinCP

ContentPresenter

ProgressBar

PART_GlowRect
PART_Indicator
PART_Track

FrameworkElement
FrameworkElement
FrameworkElement

ScrollBar

PART_Track

Track

ScrollViewer

PART_HorizontalScrollBar
PART_ScrollContentPresenter
PART_VerticalScrollBar

ScrollBar
ScrollContentPresenter
ScrollBar

Slider

PART_SelectionRange
PART_Track

FrameworkElement
Track

StickyNoteControl

PART_ClipboardSeparator

Separator

PART_CloseButton
PART_ContentControl
PART_CopyMenuItem
PART_EraseMenuItem
PART_IconButton
PART_InkMenuItem
PART_PasteMenuItem
PART_ResizeBottomRightThumb
PART_SelectMenuItem
PART_TitleThumb

Button
ContentControl
MenuItem
MenuItem
Button
MenuItem
MenuItem
Thumb
MenuItem
Thumb

TabControl

PART_SelectedContentHost

ContentPresenter

TextBoxBase

PART_ContentHost

FrameworkElement

ToolBar

PART_ToolBarOverflowPanel
PART_ToolBarPanel

ToolBarOverflowPanel
ToolBarPanel

TreeViewItem

PART_Header

FrameworkElement

508

14. , ,

, , WPF
( ),
(
), !
, , .
, , -
,
ProgressBar.

, Templa
tePartAttribute, , .
. WPF
, PART_XXX (,
, CalendarItem); Silverlight
.
, ,
. , , ,
,
!


,
WPF4. ,
(
VisualStateManager.GoToState).

, .
, WPF4
.
Expression Blend,
Silverlight.
, ,
. , Button
CommonStates: Normal, MouseOver, Pressed Disabled,
FocusStates: Unfocused Focused.
Button ,
Normal Unfocused.
, ,
(, NormalUnfocused, NormalFocused, MouseOver
Unfocused, MouseOverFocused .).
.14.2 ,
WPF.
DataGridRow DataGridRowHeader;
. (, -
.) , , ;

509

Button ButtonBase. Data


GridColumnHeader SortStates,
ButtonBase.
, . , ProgressBar
CommonStates: Determinate Indeterminate,
, Range
Base, , , CommonStates,
FocusStates .
14.2. ,
WPF

ButtonBase

CommonStates

Normal, MouseOver, Pressed, Disabled

FocusStates

Unfocused, Focused

SelectionStates

Unselected, Selected

CalendarButtonFocus
States

CalendarButtonUnfocused, CalendarBut
tonFocused

ActiveStates

Inactive, Active

SelectionStates

Unselected, Selected

CalendarButtonFocus
States

CalendarButtonUnfocused, Calendar
ButtonFocused

ActiveStates

Inactive, Active

DayStates

RegularDay, Today

BlackoutDayStates

NormalDay, BlackoutDay

CalendarItem

CommonStates

Normal, Disabled

ComboBox

CommonStates

Normal, MouseOver, Disabled

FocusStates

Unfocused, Focused, FocusedDropDown

EditStates

Editable, Uneditable

CommonStates

Normal, MouseOver

SelectionStates

Unselected, Selected, SelectedUnfocused

FocusStates

Unfocused, Focused

Control

ValidationStates

Valid, InvalidFocused, InvalidUnfocused

DataGrid

CommonStates

Normal, Disabled

DataGridCell

CommonStates

Normal, MouseOver

SelectionStates

Unselected, Selected

FocusStates

Unfocused, Focused

CurrentStates

Regular, Current

InteractionStates

Display, Editing

CalendarButton

CalendarDayButton

ComboBoxItem

510

14. , ,

14.2 ()

DataGridColumnHeader

SortStates

Unsorted, SortAscending, SortDescending

DataGridRow

CommonStates

Normal, Normal_AlternatingRow, Normal_


Editing, Normal_Selected, Unfocused_
Editing, Unfocused_Selected, MouseOver,
MouseOver_Editing, MouseOver_Selected,
MouseOver_Unfocused_Editing, MouseOver_
Unfocused_Selected

DataGridRowHeader

CommonStates

Normal, Normal_Selected, Normal_Edit


ingRow, Normal_CurrentRow, Normal_Cur
rentRow_Selected, Unfocused_Selected,
Unfocused_EditingRow, Unfocused_Cur
rentRow_Selected, MouseOver, MouseOver_
Selected, MouseOver_EditingRow, Mouse
Over_CurrentRow, MouseOver_CurrentRow_
Selected, MouseOver_Unfocused_Selected,
MouseOver_Unfocused_EditingRow, Mouse
Over_Unfocused_CurrentRow_Selected

DatePicker

CommonStates

Normal, Disabled

DatePickerTextBox

WatermarkStates

Unwatermarked, Watermarked

Expander

CommonStates

Normal, MouseOver, Disabled

FocusStates

Unfocused, Focused

ExpansionStates

Expanded, Collapsed

ExpandDirectionStates ExpandDown, ExpandUp, ExpandLeft,


ExpandRight
GridSpliter

CommonStates

Normal, MouseOver, Disabled

ListBoxItem

CommonStates

Normal, MouseOver, Disabled

SelectionStates

Unselected, Selected, SelectedUnfocused

FocusStates

Unfocused, Focused

ProgressBar

CommonStates

Determinate, Indeterminate

RangeBase

CommonStates

Normal, MouseOver, Disabled

FocusStates

Unfocused, Focused

CommonStates

Normal, MouseOver, Disabled

FocusStates

Unfocused, Focused

TabControl

CommonStates

Normal, Disabled

TabItem

CommonStates

Normal, MouseOver, Disabled

SelectionStates

Unselected, Selected

FocusStates

Unfocused, Focused

ScrollBar

511

TextBox

CommonStates

ReadOnly ( TextBoxBase)

TextBoxBase

CommonStates

Normal, MouseOver, Disabled

FocusStates

Unfocused, Focused

CommonStates

Normal, MouseOver, Pressed, Disabled

FocusStates

Unfocused, Focused

ToggleButton

CheckStates

Checked, Unchecked, Indeterminate

ToolTip

OpenStates

Open, Closed

FocusStates

Unfocused, Focused

CommonStates

Normal, MouseOver, Disabled

SelectionStates

Unselected, Selected, SelectedInactive

FocusStates

Unfocused, Focused

ExpansionStates

Collapsed, Expanded

HasItemsStates

HasItems, NoItems

Thumb

TreeViewItem

, ,
VisualStateManager.VisualStateGroups
VisualSta
teGroup,
VisualState.
14.11
14.9, ProgressBar ;
.
ProgressBar Determinate Indeterminate,
Normal Disabled, -
, IsEnabled
false. , , IsIn
determinate true,
Indeterminate.
14.11.
VSM
<Application x:Class="WindowsApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WindowsApplication1"
StartupUri="Window1.xaml">
<Application.Resources>
<ControlTemplate x:Key="progressPie" TargetType="{x:Type ProgressBar}">

512

14. , ,

<!-- -->
<ControlTemplate.Resources>
<local:ValueMinMaxToPointConverter x:Key="converter1"/>
<local:ValueMinMaxToIsLargeArcConverter x:Key="converter2"/>
</ControlTemplate.Resources>
<!-- -->
<Viewbox>
<!-- -->
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualState Name="Determinate"/> <!-- -->
<VisualState Name="Indeterminate">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="pie"
Storyboard.TargetProperty="Opacity" To="0" Duration="0"/>
<DoubleAnimation Storyboard.TargetName="backgroundNormal"
Storyboard.TargetProperty="Opacity" To="0" Duration="0"/>
<DoubleAnimation Storyboard.TargetName="backgroundIndeterminate"
Storyboard.TargetProperty="Opacity" To="1" Duration="0"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid Width="20" Height="20">
<Ellipse x:Name="backgroundIndeterminate" Opacity="0"
Stroke="{TemplateBinding BorderBrush}"
StrokeThickness="{TemplateBinding BorderThickness}"
Width="20" Height="20">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="Yellow"/>
<GradientStop Offset="1" Color="Brown"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse x:Name="backgroundNormal" Stroke="{TemplateBinding BorderBrush}"
StrokeThickness="{TemplateBinding BorderThickness}"
Width="20" Height="20" Fill="{TemplateBinding Background}"/>
<Path x:Name="pie" Fill="{TemplateBinding Foreground}">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="10,10" IsClosed="True">
<LineSegment Point="10,0"/>
<ArcSegment Size="10,10" SweepDirection="Clockwise">
<ArcSegment.Point>
<MultiBinding Converter="{StaticResource converter1}">
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Value"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Minimum"/>

513

<Binding RelativeSource="{RelativeSource TemplatedParent}"


Path="Maximum"/>
</MultiBinding>
</ArcSegment.Point>
<ArcSegment.IsLargeArc>
<MultiBinding Converter="{StaticResource converter2}">
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Value"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Minimum"/>
<Binding RelativeSource="{RelativeSource TemplatedParent}"
Path="Maximum"/>
</MultiBinding>
</ArcSegment.IsLargeArc>
</ArcSegment>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
</Viewbox>
<!-- -->
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="pie" Property="Fill">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="Gray"/>
<GradientStop Offset="1" Color="White"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Application.Resources>
</Application>

VisualState Storyboard,
17.
( 14.11),
. Storyboard
Fill , , LinearGradientBrush,
backgroundNormal,
, backgroundIndeterminate,
( Opacity 0).
Indeterminate
,
Opacity backgroundNormal 0,

514

14. , ,

backgroundIndeterminate 1.
, Duration
DoubleAnimation. 17
.
Button (. 14.8) ,
VSM.
,
TemplateVisualStateAttri
bute. WPF
.

VisualStateGroup Transitions ,
VisualTransition,
.
. 17.



, Template Control
Style,
:
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
...
</ControlTemplate>
</Setter.Value>
</Setter>
...
</Style>


, :
. ,

,
- !
,
,

515

. ,
, -,
.
.
, ProgressBar
. ,
. ,
Foreground - ( 14.9),
ProgressBar
Foreground. Foreground Progress
Bar , !
, Setter Style,
,
ProgressBar
Foreground. {TemplateBinding Foreground}
. Style :
<Style x:Key="pieStyle" TargetType="{x:Type ProgressBar}">
<Setter Property="Foreground">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="LightGreen"/>
<GradientStop Offset="1" Color="DarkGreen"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ProgressBar}">
...
<Path x:Name="pie" Fill="{TemplateBinding Foreground}">
...
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

:
<!-- -->
<ProgressBar Style="{StaticResource pieStyle}"
Width="100" Height="100" Value="10"/>
<!-- -->
<ProgressBar Style="{StaticResource pieStyle}" Foreground="Red"
Width="100" Height="100" Value="10"/>

, ,
Width Height.

516

14. , ,



Style ,
: Style, ,
Style, Setter Style!
,
.
Setter .

FAQ

, ?
( BasedOn
Style) . XAML-
,
. ,
, ,
,
WPF , .
XAML-
, ( ,
, ):
string xaml = XamlWriter.Save(someControl.Template);

,
. ,
DefaultStyleKey (
), Style:
//
object defaultStyleKey = someElement.GetValue(
FrameworkElement.DefaultStyleKeyProperty);
//
Style style = (Style)Application.Current.FindResource(defaultStyleKey);
// XAML-
string xaml = System.Windows.Markup.XamlWriter.Save(style);

FindResource
, typeof(Button) Button (
).
, :
Windows SDK, XAML-
, WPF.

517

.NET Reflector BAML Viewer

, , Presentation
Framework.Aero.dll.
Expression Blend,
Edit TemplateEdit a Copy (
), XAML-.
(XAML- , WPF,
Blend Program Files.)
. Blend

, .
.

()
, . WPF
, .
,
WPF (. 12
) .

. Win32 Windows Forms,
, , WPF-
XAML, , ,
. ( XAML- ;
, , -
. . FAQ .)
XAML-?

Window Page XAML-,
( , 2 XAML).

, .
XAML- ,
, ..
( , ,
.) Visual Studio 2010
, XAML.
Page,
. ,
Page .

518

14. , ,


, Resource
Dictionary. ,
- ,
. ,
ResourceDictionary / .
,
Window ,
(.14.13):
<Window x:Class="WindowsApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Please Wait" Height="200" Width="300" ResizeMode="NoResize">
<Grid>
<StackPanel Style="{DynamicResource DialogStyle}">
<Label Style="{DynamicResource HeadingStyle}">Loading...</Label>
<ProgressBar Value="35" MinHeight="20" Margin="20"/>
<Button Style="{DynamicResource CancelButtonStyle}" Width="70"
Click="Cancel_Click">Cancel</Button>
</StackPanel>
</Grid>
</Window>

.14.13. ,

,
Style. ,
,
. , , Cancel
() .
Cancel CancelButtonStyle.
,
.
Window ,
.14.13, App.xaml,
Style, :

519

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<Style x:Key="DialogStyle" TargetType="{x:Type StackPanel}">
<Setter Property="Margin" Value="20"/>
</Style>
<Style x:Key="HeadingStyle" TargetType="{x:Type Label}">
<Setter Property="FontSize" Value="16"/>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
<Style x:Key="CancelButtonStyle" TargetType="{x:Type Button}"/>
</Application.Resources>
</Application>

, CancelButtonStyle ,
. , ,
- .

,
,
!

:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="DialogStyle" TargetType="{x:Type StackPanel}">
...
</Style>
<Style x:Key="HeadingStyle" TargetType="{x:Type Label}">
...
</Style>
<Style x:Key="CancelButtonStyle" TargetType="{x:Type Button}">
...
</Style>
...
</ResourceDictionary>

XAML-
Application.Resources.
XAML-, :
ResourceDictionary resources = null;
using (FileStream fs = new FileStream("CustomSkin.xaml",
FileMode.Open, FileAccess.Read))
{

520

14. , ,

// , ResourceDictionary
resources = (ResourceDictionary)XamlReader.Load(fs);
}
Application.Current.Resources = resources;

, URL:
ResourceDictionary resources = null;
System.Net.WebClient client = new System.Net.WebClient();
using (Stream s = client.OpenRead("http://adamnathan.net/wpf/CustomSkin.xaml"))
{
// , ResourceDictionary
resources = (ResourceDictionary)XamlReader.Load(s);
}
Application.Current.Resources = resources;

Application.Current.Resources
, - ResourceDictionary,
,
!

FAQ
, ,
?
Application.Resources , - , ,
,
. ,
.
, . ,
, CancelButtonStyle,
:
System.Windows.ResourceDictionary Warning: 9 : Resource not found;
ResourceKey='CancelButtonStyle'

, -:
/
.

(
http://informit.com/title/9780672331190
)
Cancel. , ,
.

.14.13; .14.14.

521

.14.14.

, Prog
ressBar ( ,
),
.
ProgressBar. , ,
ResourceDictionary
,
. CancelButtonStyle, ,
TranslateTransform, ,
, . ,
Label:
- 1 (
, , ).


,
ProgressBar
( ),
XAML- .
ResourceDictionary
. Application.LoadComponent
,
(. 12).

, :
ResourceDictionary resources = (ResourceDictionary)Application.LoadComponent(
new Uri("CustomSkin.xaml", UriKind.RelativeOrAbsolute));
Application.Current.Resources = resources;

, -
. . .

522

14. , ,


. 14.12 .
14.12.
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- -->
<Style x:Key="DialogStyle" TargetType="{x:Type StackPanel}">
<Setter Property="Margin" Value="0"/>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="LightBlue"/>
<GradientStop Offset="1" Color="White"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
<!-- -->
<Style x:Key="HeadingStyle" TargetType="{x:Type Label}">
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="30"/>
<Setter Property="FontFamily" Value="Segoe Print"/>
<Setter Property="RenderTransform">
<Setter.Value>
<TransformGroup>
<RotateTransform Angle="-35"/>
<TranslateTransform X="-19" Y="55"/>
</TransformGroup>
</Setter.Value>
</Setter>
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect ShadowDepth="2"/>
</Setter.Value>
</Setter>
</Style>
<!-- Cancel -->
<Style x:Key="CancelButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
<!-- ProgressBar Expander -->
<Style TargetType="{x:Type ProgressBar}">
<Setter Property="Height" Value="100"/>
<Setter Property="Template">
<Setter.Value>

523

<ControlTemplate TargetType="{x:Type ProgressBar}">


<Expander Header="More Details" ExpandDirection="Left">
<ProgressBar Style="{x:Null}"
Height="30" Value="{TemplateBinding Value}"
Minimum="{TemplateBinding Minimum}"
Maximum="{TemplateBinding Maximum}"
IsEnabled="{TemplateBinding IsEnabled}"
IsIndeterminate="{TemplateBinding IsIndeterminate}"/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

DialogStyle HeadingStyle (
,
). ,
, CancelButtonStyle
Cancel! ( , ,
).
,
!
ProgressBar
.
, ProgressBar Expander (
)! Tem
plateBinding, -. ,
ProgressBar null. ,
. Style,
ProgressBar
, Expander Expander Expander ..

FAQ
?
.
,
ResourceDictionary ,
, , -, . ,
- ,
Setter, Visibility.
, ?
, - ?
!

524

14. , ,


. , -
- ,
. ( XAML-!)
.
XAML ,
.
, , ,
,
.
, , ,
.

,
,
. ,
Windows Classic,
. Windows XP
(, , )
.
Windows
WPF (
Button 9 ).
,
. ,
, ,
!
,
. ,
,
, .
,
(, ), .
. , ,
, .

,
, SystemColors, SystemFonts SystemParameters,
Windows. ,
,
.

525

ProgressBar
SystemColors
( . 12):
<Style TargetType="{x:Type ProgressBar}">
<Style.Resources>
<LinearGradientBrush x:Key="foregroundBrush" StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0"
Color="{DynamicResource {x:Static SystemColors.InactiveCaptionColorKey}}"/>
<GradientStop Offset="0.5"
Color="{DynamicResource {x:Static SystemColors.InactiveCaptionColorKey}}"/>
<GradientStop Offset="1"
Color="{DynamicResource {x:Static SystemColors.ActiveCaptionColorKey}}"/>
</LinearGradientBrush>
</Style.Resources>
<Setter Property="Foreground" Value="{StaticResource foregroundBrush}"/>
<Setter Property="Background"
Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
...
</Style>

.14.15 Win
dows.

Windows 7 (Aero)

Windows Classic

.14.15.
,


WPF
, .
Windows7 Aero , Windows Classic
. ,
.
,
, .
, - .14.15 ProgressBar Windows
Classic ! ,
, , .
,
, (
, ). WPF

526

14. , ,

,
Win32 WM_THEMECHANGE ( WM_DWMCOMPO
SITIONCHANGED 8 Windows 7). , , WPF
Win32 API
,
.
XAML, .
.
, themes
( !) ThemeName.
ThemeColor.xaml ( ). WPF

. .
Microsoft URI
:
Aero (Windows Vista Windows 7): themes\Aero.NormalColor.xaml
Windows XP : themes\Luna.NormalColor.xaml
Windows XP: themes\Luna.Homestead.xaml
Windows XP: themes\Luna.Metallic.xaml
Windows XP Media Center Edition 2005 Windows XP Tablet PC Edi
tion 2005: themes\Royale.NormalColor.xaml
Windows Classic: themes\Classic.xaml
Zune Windows XP: themes\Zune.NormalColor.xaml
Windows Classic: URI
ThemeColor.
,
, , .
; themes\Gene
ric.xaml.

, .
, .

,
, Theme
InfoAttribute.
ResourceDictionaryLocation. , WPF
, .
:

527

None . .
SourceAssembly .
ExternalAssembly , As

semblyName.ThemeName.dll ( AssemblyName
). WPF ,
PresentationFramework.Aero.dll, PresentationFramework.Luna.dll
..
.
ThemeInfoAttribute :
//
[assembly:ThemeInfo(ResourceDictionaryLocation.SourceAssembly,
ResourceDictionaryLocation.SourceAssembly)]

:
. ThemeInfoAtt
ribute, ,
, .
( ),
, .
,
Button ProgressBar ,
,
ThemeDictionaryExtension.
ThemeDictionaryExtension ,
. ,
, .
ThemeDictionaryExtension
Source ResourceDictionary,
, . :
<Application ...>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary .../>
<ResourceDictionary Source="{ThemeDictionary MyApplication}"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

, , ProgressBar
Windows. MyApplication
, TargetType {x:Type Progress
Bar}, ProgressBar
ThemeDicti
onaryExtension.

528

14. , ,


, .
20,
. ,

ProgressPie:
public class ProgressPie : ProgressBar
{
static ProgressPie()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(ProgressPie),
new FrameworkPropertyMetadata(typeof(ProgressPie)));
}
}

ProgressPie ProgressBar,
. -
, ,
ProgressBar.
ProgressPie,
DefaultStyleKey.
FrameworkElement FrameworkContentElement
. (
.)
WPF
,
. DefaultStyleKey, ProgressPie
ProgressBar, typeof(ProgressBar).
- ProgressPie typeof(ProgressPie) DefaultStyleKey.
Visual Studio,
ProgressPie, ThemeInfoAtt
ribute , .
XAML-
:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ThemedProgressPie">
<Style TargetType="{x:Type local:ProgressPie}">
...
</Style>
</ResourceDictionary>

.14.16 ProgressPie .
, ,
,

529

. , .14.16, .14.15,
ProgressPie Windows 7 , Win
dows Classic .
, ,
.

Windows 7 (Aero)

Windows Classic

.14.16.
,


Windows
Windows 7 Windows Vista
. Windows
Aero Windows Basic, WPF Aero.NormalColor.
( ,
.) Windows
Standard, Windows Classic - , WPF
Classic. ,
,
SystemColors .

, , ,
WPF.
, ( ) ,
(
), , (,
Button Style null, , ,
).
,
,
. ,
, ,
.
, -

530

14. , ,

(. 20), ,
.


WPF, WPFThemes.zip http://wpf.code
plex.com. , ,

WPF.
, Resources
Application, Window -:
<Application ...>
<Application.Resources>
<ResourceDictionary Source="BureauBlack.xaml"/>
</Application.Resources>
</Application>

, ,
, WPF4, Data
Grid, Calendar DatePicker. .14.17 ,
.

.14.17. WPF Themes

V
V.

15
16
17
18 ,

Drawing
Visual
Shape

15
15.


, , .
- ,
;
Button ProgressBar.
- ,
. ,
. , ,
, , WPF,
, .

WPF; GDI
. WPF GDI
Windows , WPF
, ,
.
(GDI, GDI+, DirectX ..)
,
. ,
, ,
.
, , ,
.
, ,
, : 1010
(0,0), .
, :
1010 (0,0) , .

534

15.

,
.
WPF , ,
, ,
.
WPF,
.
: Drawing, Visual Shape.
. Drawing
Brush
. Visual
Drawing , Visual
,
Drawing. , Shape
Visual, (
) . , Silver
light Shape. Drawing, Visual Shape
,
.
Brush,

.
;
, Foreground Background
. WPF
, . ,
, ,
,
.

Drawing
Drawing . ,
GeometryDrawing, WPF (clip art).
, ,
, Animatable, ,
, !
WPF Drawing:
GeometryDrawing Geometry Brush,
, Pen, .
.
ImageDrawing ImageSource Rect,
.
VideoDrawing MediaPlayer (. 18 ,
) Rect.

535

Drawing

GlyphRunDrawing GlyphRun,

, Brush, .
DrawingGroup Drawing

(Opacity, Transform ).
DrawingGroup Drawing,
, Drawing. ( ,
TransformGroup Transform.)
GeometryDrawing,
Geometry, (EllipseGeometry), Brush
Pen:
<GeometryDrawing Brush="Orange" >
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<EllipseGeometry RadiusX="100" RadiusY="50"/>
</GeometryDrawing.Geometry>
</GeometryDrawing>

Brush
Pen

Geometry

Drawing UIElement;
. GeometryDrawing
Window ContentControl,
TextBlock, "System.Windows.Media.Geometry
Drawing" ( , ToString).
Drawing ,
-:
DrawingImage ImageSource,
Image BitmapImage.
DrawingBrush Brush,
, Foreground, Background Border
Brush , Control.
DrawingVisual Visual,
Visual.
, DrawingImage
, :
<Image>
<Image.Source>
<DrawingImage>
<DrawingImage.Drawing>
<GeometryDrawing Brush="Orange">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<EllipseGeometry RadiusX="100" RadiusY="50"/>

536

15.

</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>

.15.1 Image
, GeometryDrawing.

.15.1. EllipseGeometry, GeometryDrawing,


DrawingImage, Image


DrawingImage ImageDrawing
, DrawingImage
ImageDrawing. ,
.
DrawingImage ImageSource
Drawing, . , Image
Drawing Drawing, Ima
geSource, .
:
WPF ( ) FooBar
, Bar,
Foo. , DrawingImage ImageSource,
Drawing, ImageDrawing Drawing, ImageSource.

, DrawingImage ImageSource,

. Window.Icon ImageSource,
TaskbarItemInfo.Overlay ThumbButtonInfo.ImageSource (. 8
Windows7). .15.2 , ,
DrawingImage GeometryDrawing
:
<Window ...>
<Window.Icon>
<DrawingImage>
<DrawingImage.Drawing>
<GeometryDrawing Brush="Orange">

Drawing

537

<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<EllipseGeometry RadiusX="100" RadiusY="50"/>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Window.Icon>
...
</Window>

.15.2. EllipseGeometry
Window, -

, ,
, . Brush
, , Drawing
. .
GeometryDrawing:
Geometry Pen.

Geometry
Geometry .
,
, : ?
?. Geometry ,
.


:
RectangleGeometry Rect,
, RadiusX RadiusY .
EllipseGeometry RadiusX RadiusY, Center.

538

15.


Geometry
Geometry Drawing,
WPF. , System.Windows.Ink.
Stroke Geometry (
GetGeometry), DrawingGroup Visual
Clip,
Geometry.

LineGeometry StartPoint EndPoint,

.
PathGeometry PathFigure
Figures; .
Path
Geometry, . ,
PathGeometry.
PathGeometry.
PathFigure PathSegment. PathFigure Path
Geometry PathSegment
Segments. PathSegment

:
LineSegment .
PolyLineSegment
LineSegment ( ).
ArcSegment .
BezierSegment .
PolyBezierSegment
BezierSegment.
QuadraticBezierSegment .
PolyQuadraticBezierSegment
QuadraticBezierSegment.



( )
.
.

Drawing

539

,
,
. (
), , .
,
, .
, QuadraticBezierSegment
, BezierSegment, .
U- (
), S- .

GeometryDrawing, PathGeometry,
LineSegment, L (.15.3):
<GeometryDrawing>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<PathGeometry>
<PathFigure>
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
</PathGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>

.15.3. GeometryDrawing,
LineSegments

, , .15.3,
GeometryDrawing - Drawing
Image, .
, LineSegment
Point. ,
.
(0,0) (0,100), (0,100) (100,100).
( PathSegment .)
, Start
Point PathFigure Point, (0,0).

540

15.

, ,
. . 15.4 ,
, ,
. 15.4
XAML- Brush:
<GeometryDrawing Brush="Orange">
...
</GeometryDrawing>

.15.4. GeometryDrawing
.15.3,

.15.5. GeometryDrawing
.15.4, IsClosed="True"

,
PathFigure LineSegment
IsClosed PathFigure true.
.15.5.
PathSegment PathFigure
,
Geometry PathGeometry
PathFigure. PathFigure
, PathFigure.
, XAML- , .15.5,
StartPoint,
:
<GeometryDrawing Brush="Orange">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<PathGeometry>
<!-- 1 -->
<PathFigure IsClosed="True">
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
<!-- 2 -->
<PathFigure StartPoint="70,0" IsClosed="True">
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
</PathGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>

541

Drawing

GeometryDrawing PathFigure
.15.6. ,
LineSegment true IsSmoothJoin (
PathSegment). . 15.6 ,
.


XAML

IsSmoothJoin="True"
LineSegments

.15.6. ,
PathFigures

, , .
PathGeometry
FillRule.
FillRule.
,
PathFigure PathSegment
PathFigure,
( ) .
FillRule PathGeometry (
FillRule), :
EvenOdd ,
, ,
. .
NonZero ,
, ,
.
.
EvenOdd NonZero .15.7
, .15.6.

EvenOdd

NonZero

.15.7.
PathGeometry.FillRule

542

15.


WPF
GeometryGroup CombinedGeometry ,
. , ,
TransformGroup Transform, DrawingGroup Drawing,
Geometry,
, Geometry.


StreamGeometry
,
, StreamGeometry, Path
Geometry . StreamGeometry
, PathGeometry, .
:
( ), PathFigure Path
Segment , .NET.
StreamGeometry
, .15.6:
StreamGeometry g = new StreamGeometry();
using (StreamGeometryContext context = g.Open())
{
// 1
context.BeginFigure(new Point(0, 0), true /*isFilled*/, true /*isClosed*/);
context.LineTo(new Point(0, 100), true /*isStroked*/, true /*isSmoothJoin*/);
context.LineTo(new Point(100, 100), true /*isStroked*/, true /*isSmoothJoin*/);
// 2
context.BeginFigure(new Point(70, 0), true /*isFilled*/, true /*isClosed*/);
context.LineTo(new Point(0, 100), true /*isStroked*/, true /*isSmoothJoin*/);
context.LineTo(new Point(100, 100), true /*isStroked*/, true /*isSmoothJoin*/);
}
// Geometry
// GeometryDrawing:
geometryDrawing.Geometry = g;

LineSegment, ArcSegment, BezierSegment


, , LineTo, ArcTo BezierTo.
WPF
StreamGeometry.

GeometryGroup. GeometryGroup
Geometry. , XAML-
.15.6
(
PathFigure) :

Drawing

543

<GeometryDrawing Brush="Orange">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<GeometryGroup>
<!-- 1 -->
<PathGeometry>
<PathFigure IsClosed="True">
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
</PathGeometry>
<!-- 2 -->
<PathGeometry>
<PathFigure StartPoint="70,0" IsClosed="True">
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
</PathGeometry>
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>

GeometryGroup, PathGeometry, FillRule,


EvenOdd. FillRule
.
, : GeometryGroup,
PathGeometry,
PathFigure? , GeometryGroup
, RectangleGeo
metry EllipseGeometry, .
, GeometryGroup ,
Geometry, .
, GeometryGroup
, 25:
<GeometryDrawing Brush="Orange">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<GeometryGroup>
<!-- 1 -->
<PathGeometry>
<PathFigure IsClosed="True">
<LineSegment Point="0,100" IsSmoothJoin="True"/>
<LineSegment Point="100,100" IsSmoothJoin="True"/>
</PathFigure>
</PathGeometry>

544

15.

<!-- 2 -->
<PathGeometry>
<PathGeometry.Transform>
<RotateTransform Angle="25"/>
</PathGeometry.Transform>
<PathFigure IsClosed="True">
<LineSegment Point="0,100" IsSmoothJoin="True"/>
<LineSegment Point="100,100" IsSmoothJoin="True"/>
</PathFigure>
</PathGeometry>
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>

.15.8.
PathGeometry PathFigure .
PathGeometry PathFigure,
.
GeometryGroup .

.15.8. GeometryGroup
,

Brush Pen Drawing, Geometry,


GeometryGroup
. , DrawingGroup,
(
).

UIElement, ,
Geometry, PathFigure
.
, .
,
.

Drawing

545

GeometryGroup, .15.8,
PathFigure .
PathFigure figure GeometryGroup
:
<GeometryGroup>
<!-- 1 -->
<PathGeometry>
<StaticResource ResourceKey="figure"/>
</PathGeometry>
<!-- 2 -->
<PathGeometry>
<PathGeometry.Transform>
<RotateTransform Angle="25"/>
</PathGeometry.Transform>
<StaticResource ResourceKey="figure"/>
</PathGeometry>

CombinedGeometry. CombinedGeometry, GeometryGroup,


. ( )
,
GeometryCombineMode:
Union
. .
Intersect
.
Xor ,
, .
Exclude ,
, .
CombinedGeometry Geometry1 Geometry2,
, GeometryCombineMode,
. . 15.9
.15.8.
<GeometryDrawing Brush="Orange">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<CombinedGeometry GeometryCombineMode="XXX">
<CombinedGeometry.Geometry1>
<!-- 1 -->
<PathGeometry>
...
</PathGeometry>
</CombinedGeometry.Geometry1>

546

15.

<CombinedGeometry.Geometry2>
<!-- 2 -->
<PathGeometry>
...
</PathGeometry>
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>

Union

Intersect

Xor

Exclude

.15.9. CombinedGeometry
GeometryCombineMode;


Geometry
, ,
.
XAML- ,
- , ,
.
WPF GeometryConverter,
,
PathGeometry . Geometry
Parse,
Geometry. ( , ,
, Geometry.Parse,
StreamGeometry,
.)
, PathGeometry,
.15.6:
<GeometryDrawing>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<PathGeometry>
<PathFigure IsClosed="True">

547

Drawing
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
</PathGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>

:
<GeometryDrawing Geometry="M 0,0 L 0,100 L 100,100 Z">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
</GeometryDrawing>

.15.6
:
<GeometryDrawing Geometry="M 0,0 L 0,100 L 100,100 Z M 70,0 L 0,100 L 100,100 Z">
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="10"/>
</GeometryDrawing.Pen>
</GeometryDrawing>

, Path
Geometry PathFigure, .
, . .15.1
.
15.1.

PathGeometry PathFigure
F n

FillRule, 0 EvenOdd, 1 NonZero.


, .

M x,y

PathFigure StartPoint (x,y).


( F).
M move (.)

PathFigure IsClosed true.


M,
PathFigure , -
, PathFigure .
PathFigure, Z .

PathSegment
L x,y

LineSegment, (x,y).

A rx,ry d f1 f2
x,y

ArcSegment, (x,y)
rx ry,
d . f1 f2 0 (false) 1
(true) ArcSegment: IsLargeArc (
) Clockwise ( ).

548

15.

15.1 ()

C x1,y1 x2,y2 x,y

BezierSegment, (x,y),
(x1,y1)
(x2,y2). C cubic ( ).

Q x1,y1 x,y

QuadraticBezierSegment,
(x,y),
(x1,y1).


H x

LineSegment, (x,y), y
. H horizontal
( ).

V y

LineSegment, (x,y), x
. V vertical
( ).

S x2,y2 x,y

BezierSegment,
(x,y),
(x1,y1) (x2,y2). x1 y1 ,
. (
, ,
BezierS egment.)
S smooth ( ).

,
,
. F, M Z ,
.



,
,
. , M 0,0 L 0,100 L 100,100 Z
M0 0L0 100L100 100Z, .

Pen
GeometryDrawing
, ( Pen)
. , , ,
Thickness. , Pen,
, : Brush ( Brush) Thickness ( double).

Drawing

549

Pen
:
StartLineCap EndLineCap
, PenLineCap: Flat (
, ), Square, Round Triangle.
LineJoin.
LineJoin .
PenLineJoin: Miter ( ),
Round Bevel. MiterLimit ,
Miter; ,
.
10.
DashStyle , (
). DashStyle.
DashCap
Pen; StartLineCap EndLineCap,
Square, Flat.

FAQ
Flat Square
PenLineCap?
Flat , Square
. ,
, . ,
.

. 15.10 PenLineCap,
LineSegment. .15.11
LineJoin . Round
LineJoin , true IsSmoothJoin
PathSegment.
, LineJoin
.
Flat
Square
Round
Triangle
.15.10. PenLineCap,

550

15.

Miter

Round

Bevel

.15.11. LineJoin

DashStyle Dashes. DoubleCol


lection, ,
.
( ),
. .
DashStyle Offset double, ,
.
DashStyle ,
DashCap Square,
. ,
0, .
DashStyles, DashStyle
.
, DashDotDot:
<Pen Brush="Black" Thickness="10" DashStyle="{x:Static DashStyles.DashDotDot}"/>

.15.12 DashStyles
Dashes.

Solid

Dash (2,2)

Dot (0,2)

DashDot (2,2,0,2)

DashDotDot
(2,2,0,2,0,2)

.15.12. ,

DashCap Miter: Square LineJoin


, GeometryDrawing,
. 15.1 DrawingGroup,

Drawing

551

Image, GeometryDrawing,
(.15.13).
15.1. Drawing,
Image
<Image>
<Image.Source>
<DrawingImage>
<DrawingImage.Drawing>
<DrawingGroup>
<!-- -->
<GeometryDrawing Brush="Blue" Geometry="M 240,250
C 200,375 200,250 175,200
C 100,400 100,250 100,200
C 0,350 0,250 30,130
C 75,0 100,0 150,0
C 200,0 250,0 250,150 Z"/>
<!-- -->
<GeometryDrawing Brush="Black">
<GeometryDrawing.Pen>
<Pen Brush="White" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<GeometryGroup>
<!-- -->
<EllipseGeometry RadiusX="15" RadiusY="15" Center="95,95"/>
<!-- -->
<EllipseGeometry RadiusX="15" RadiusY="15" Center="170,105"/>
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>
<!-- -->
<GeometryDrawing>
<GeometryDrawing.Pen>
<Pen Brush="Black" StartLineCap="Round"
EndLineCap="Round" Thickness="10"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Geometry>
<LineGeometry StartPoint="75,160" EndPoint="175,150"/>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>

552

15.

.15.13. , DrawingGroup,
GeometryDrawing

Visual
Visual, UIElement (
FrameworkElement),
.
Drawing Image. Image
Visual, ,
FrameworkElement UIElement, ,
, , ,
, , ,
, ,
..
,
, -
Bing Maps.
WPF,
Drawing.
Image,
.
Image, ,
, .
, Visual ,
Drawing : DrawingVisual.

, Opacity Clip ( , ,
DrawingGroup).

( Visual).
DrawingVisual
, WPF,
. , DrawingVisual ,

Visual.

Visual

553

DrawingVisual
DrawingVisual Drawing,
Drawing (, - ,
).
RenderOpen, DrawingContext.
, Close.
, Drawing
15.1 DrawingVisual ,
ghostDrawing:
DrawingGroup ghostDrawing = FindResource("ghostDrawing") as DrawingGroup;
DrawingVisual ghostVisual = new DrawingVisual();
using (DrawingContext dc = ghostVisual.RenderOpen())
{
dc.DrawDrawing(ghostDrawing);
}

, DrawingContext
IDisposable Close Dispose (
finally using).
15.1 GeometryDrawing, ,
DrawingGroup ,
Drawing,
DrawingImage. DrawingVisual Geometry
Drawing . Geomet
ryDrawing DrawingContext , ,
:
GeometryDrawing bodyDrawing = FindResource("bodyDrawing") as GeometryDrawing;
GeometryDrawing eyesDrawing = FindResource("eyesDrawing") as GeometryDrawing;
GeometryDrawing mouthDrawing = FindResource("mouthDrawing") as GeometryDrawing;
DrawingVisual ghostVisual = new DrawingVisual();
using (DrawingContext dc = ghostVisual.RenderOpen())
{
dc.DrawDrawing(bodyDrawing);
dc.DrawDrawing(eyesDrawing);
dc.DrawDrawing(mouthDrawing);
}

,
Z-.
DrawingGroup,
Drawing! Drawing
, DrawingContext.
DrawingContext
, . ( ,
,
Drawing: GeometryDrawing, ImageDrawing, VideoDrawing

554

15.

GlyphRunDrawing.)
. DrawingContext .15.2.
15.2. DrawingContext

GeometryDrawing DrawRectangle, DrawRoundedRec


Geometry Drawing
tangle, DrawEllipse, DrawLine
Drawing DrawGeometry, DrawImage, DrawVi
Drawing
deo, DrawGlyphRun, DrawText
Drawing DrawDrawing
Drawing

PushClip, PushEffect,
PushGuidelineSet, PushOpacity,
PushOpacityMask, PushTransform,
Pop

Close

PushXXX Pop ,
, ,
. WPF4 PushEffect
, , .
15.2
15.1 . Window
DrawingVisual, Drawing.
, Window, ,
, Drawing
Visual! .
15.2. WindowHostingVisual.cs
15.1 DrawingContext
using System;
using System.Windows;
using System.Windows.Media;
public class WindowHostingVisual : Window
{
public WindowHostingVisual()
{
Title = "Hosting DrawingVisuals";
Width = 300;
Height = 350;
DrawingVisual ghostVisual = new DrawingVisual();
using (DrawingContext dc = ghostVisual.RenderOpen())
{

Visual

555

//
dc.DrawGeometry(Brushes.Blue, null, Geometry.Parse(
@"M 240,250
C 200,375 200,250 175,200
C 100,400 100,250 100,200
C 0,350 0,250 30,130
C 75,0 100,0 150,0
C 200,0 250,0 250,150 Z"));
//
dc.DrawEllipse(Brushes.Black, new Pen(Brushes.White, 10),
new Point(95, 95), 15, 15);
//
dc.DrawEllipse(Brushes.Black, new Pen(Brushes.White, 10),
new Point(170, 105), 15, 15);
//
Pen p = new Pen(Brushes.Black, 10);
p.StartLineCap = PenLineCap.Round;
p.EndLineCap = PenLineCap.Round;
dc.DrawLine(p, new Point(75, 160), new Point(175, 150));
}
}
}

DrawGeometry
.
Geometry.Parse
, 15.1,
PathFigure, BezierSegment.
Geometry;
DrawEllipse DrawLine. , ,
, Pen
, .
XAML- 15.1, 15.2
.
.
,
DrawGeometry DrawingContext ,
, , , DrawText
. ,
, DrawImage
,
Image . (
DrawImage ImageSource, Image.)
, DrawingContext WPF
Win32 Graphics Windows Forms. ,
DrawingContext ,
.
; WPF , .

556

15.

DrawingContext
,
Drawing, , ..
.

Visual
Visual, UIEle
ment, ;
Content , Window,
,
,
, OnRender. Visual,
UIElement, DrawingVisual
,
, ToString.
Visual ,
- UIElement.
: , ! - ,
DrawingVisual ,
, UIElement! - ,
UIElement - , .
Visual
Canvas Window,
UIElement.
Visual ,
- UIElement
: VisualChildrenCount GetVisualChild.
15.3 Window,
15.2. , ,
DrawingVisual, . 15.14. ,
, DrawingImage Image.
15.3. WindowHostingVisual.cs ,

using System;
using System.Windows;
using System.Windows.Media;
public class WindowHostingVisual : Window
{
DrawingVisual ghostVisual = null;

Visual
public WindowHostingVisual()
{
Title = "Hosting DrawingVisuals";
Width = 300;
Height = 350;
ghostVisual = new DrawingVisual();
using (DrawingContext dc = ghostVisual.RenderOpen())
{
, 15.2...
}
// :
AddVisualChild(ghostVisual);
AddLogicalChild(ghostVisual);
}
// ,
// Visual:
protected override int VisualChildrenCount
{
get { return 1; }
}
protected override Visual GetVisualChild(int index)
{
if (index != 0)
throw new ArgumentOutOfRangeException("index");
return ghostVisual;
}
}

.15.14. DrawingVisual, ,
,
VisualChildrenCount GetVisualChild

557

558

15.

VisualChildrenCount Visual,
Window.
DrawingVisual, 1. GetVisualChild
Visual ( 0).
DrawingVisual, 0,
.
Visual,
, .
, MeasureOverride
ArrangeOverride; 21
.
, VisualChildrenCount/GetVisualChild,
15.3, Content
Window, . ,
Visual - ,
UIElement, , .
, ,
Visual , Canvas,
Grid ( ) Window,
.
15.3
: DrawingVisual ,
Window: AddVisualChild (
Visual) AddLogicalChild ( FrameworkElement).
DrawingVisual, , ,
,
. ,
, ,
, .
Visual ,
RemoveVisualChild RemoveLogicalChild.


Visual
Visual, UIElement,
UIElement, , .
Visual ,
- UIElement. , Visual
PrintVisual PrintDialog
Win32 ( 19
). DrawingVisual RenderTargetBitmap,
.

Visual

559


Visual.AddVisualChild!
AddVisualChild ,
Visual. .
VisualChildrenCount GetVisualChild.



Drawing
Visual, ,
,
UIElement. UIElement,
DrawingVisual. UIElement
, DrawingVisual: OnRender,
, DrawingContext,
- ,
Content ContentControl. , , ,
Drawing Image ,

UIElement .

Visual
(hit testing) ,
( ) .
, ,
, , .
WPF : Visual,
, Visual,
, UIElement.
Visual,
Shape.
Visual
, ,
, ,
UIElement (MouseLeftButtonDown, MouseEnter, MouseLeave, MouseMove
). - UIElement
Visual, ,
- Visual,
.

560

15.


Visual
VisualTreeHelper.HitTest.
Visual, ,
(
). HitTestResult,
Visual , .
, 15.3
( DrawingVisual),
1 ( ):
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
//
Point location = e.GetPosition(this);
//
HitTestResult result = VisualTreeHelper.HitTest(this, location);
// ghostVisual,
if (result.VisualHit == ghostVisual)
{
if (ghostVisual.Transform == null)
ghostVisual.Transform = new RotateTransform();
(ghostVisual.Transform as RotateTransform).Angle++;
}
}

Image Visual,
,
DrawingImage, Image ( 15.1). (
MouseLeftButtonDown Image.)
Image
DrawingVisual. ,
DrawingVisual,
- . Image
, -
, .

Visual

, , , ,
: , .
DrawingVisual . 15.4

Visual

561

1 , . .15.15
,
.
15.4. WindowHostingVisual.cs
DrawingVisual
using
using
using
using
using

System;
System.Windows;
System.Windows.Input;
System.Windows.Media;
System.Collections.Generic;

public class WindowHostingVisual : Window


{
List<Visual> visuals = new List<Visual>();
public WindowHostingVisual()
{
Title = "Hosting DrawingVisuals";
Width = 300;
Height = 350;
DrawingVisual bodyVisual = new DrawingVisual();
DrawingVisual eyesVisual = new DrawingVisual();
DrawingVisual mouthVisual = new DrawingVisual();
using (DrawingContext dc = bodyVisual.RenderOpen())
{
//
dc.DrawGeometry(Brushes.Blue, null, Geometry.Parse(
@"M 240,250
C 200,375 200,250 175,200
C 100,400 100,250 100,200
C 0,350 0,250 30,130
C 75,0 100,0 150,0
C 200,0 250,0 250,150 Z"));
}
using (DrawingContext dc = eyesVisual.RenderOpen())
{
//
dc.DrawEllipse(Brushes.Black, new Pen(Brushes.White, 10),
new Point(95, 95), 15, 15);
//
dc.DrawEllipse(Brushes.Black, new Pen(Brushes.White, 10),
new Point(170, 105), 15, 15);
}

562

15.
using (DrawingContext dc = mouthVisual.RenderOpen())
{
//
Pen p = new Pen(Brushes.Black, 10);
p.StartLineCap = PenLineCap.Round;
p.EndLineCap = PenLineCap.Round;
dc.DrawLine(p, new Point(75, 160), new Point(175, 150));
}
visuals.Add(bodyVisual);
visuals.Add(eyesVisual);
visuals.Add(mouthVisual);

// :
foreach (Visual v in visuals)
{
AddVisualChild(v);
AddLogicalChild(v);
}
}
// ,
// Visual:
protected override int VisualChildrenCount
{
get { return visuals.Count; }
}
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= visuals.Count)
throw new ArgumentOutOfRangeException("index");
return visuals[index];
}
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
//
Point location = e.GetPosition(this);
// Visual
HitTestResult result = VisualTreeHelper.HitTest(this, location);
// - DrawingVisual,
if (result.VisualHit.GetType() == typeof(DrawingVisual))
{
DrawingVisual dv = result.VisualHit as DrawingVisual;
if (dv.Transform == null)
dv.Transform = new RotateTransform();

Visual

563

(dv.Transform as RotateTransform).Angle++;
}
}
}

.15.15. ,
DrawingVisual,

Visual, ,
List<Visual> Visual
ChildrenCount GetVisualChild. DrawingVisual
, : Draw
ingContext using, DrawingVisual.
HitTestResult
DrawingVisual, .


DrawingVisual DrawingVisual
DrawingVisual ContainerVisual,
- Children
Visual. ( ContainerVisual VisualGroup
WPF, TransformGroup, DrawingGroup GeometryGroup.)
15.4
eyesVisual mouthVisual bodyVisual,
visuals. ,
, - Visual, !

DrawingVisual, ContainerVisual VisualChildrenCount
GetVisualChild , 15.4.
Window DrawingVisual DrawingVisual
!

564

15.


Visual
Visual
Visual, ,
. , Visual,
,
, .
Visual ,
.
,
HitTest, HitTestResultCallback.
HitTest ,
Visual,
.
OnMouseLeftButtonDown
15.4
Visual:
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
//
Point location = e.GetPosition(this);
// Visual
VisualTreeHelper.HitTest(this, null,
new HitTestResultCallback(HitTestCallback),
new PointHitTestParameters(location));
}
public HitTestResultBehavior HitTestCallback(HitTestResult result)
{
// - DrawingVisual,
if (result.VisualHit.GetType() == typeof(DrawingVisual))
{
DrawingVisual dv = result.VisualHit as DrawingVisual;
if (dv.Transform == null)
dv.Transform = new RotateTransform();
(dv.Transform as RotateTransform).Angle++;
}
//
return HitTestResultBehavior.Continue;
}

.
, HitTestResult
, HitTest

Visual

565

.
HitTestResultBehavior: Continue Stop. ,
Visual.
Stop,
Visual, ,
, .
HitTest, null,
HitTestFilterCallback,
, .
.
, HitTest Point
, PointHitTestParameters. ,
HitTestParameters,
WPF : PointHitTestParameters GeometryHitTestPara
meters.
.
,
.

FAQ

,
HitTestResult?
.
WPF ,
, Visual
. ,
,
, HitTestResultBehavior.Stop.

, Visual,
,
, ,
HitTestCore Visual,
. (
.)
Visual
,
. Visual
: ,
.

566

15.

!

,
.
,
,
HitTest. ,
HitTest ,
.

Shape
Shape, GeometryDrawing, ,
Geometry Pen Brush. , Geometry
Drawing, Shape FrameworkElement

. ,
2 XAML ,
Button , Rectangle (
Shape):
<Button MinWidth="75">
<Rectangle Height="20" Width="20" Fill="Black"/>
</Button>

WPF ,
System.Windows.Shapes.Shape:
Rectangle
Ellipse
Line
Polyline
Polygon
Path
,
Geometry.
, ,
Geometry. ( , Polyline Polygon
Shape , PathGeometry.)
Shape
. Fill
Stroke, Brush.

Shape

567

FAQ
Shape.Stroke Brush, Pen?
Fill Stroke Shape , Brush Pen
GeometryDrawing: Fill
, Stroke .
Shape Pen.
, Shape Stroke
Brush
, Stroke: StrokeStartLineCap, StrokeEndLineCap,
StrokeThickness ..
,
Shape ,
Pen, ,
Brush Thickness.

Shape
!
Shape ,
. ,
Drawing, ,
WPF . ,
XAML
Shape ,
. ,
Microsoft Expression Design XAML Export,
XAML- Shape
Canvas, Document Format
Resource Dictionary. DrawingImage
DrawingBrush. DrawingImage ,
, ,
.
Shape,
, , , ,
, .. , ,
, ,
Visual ,
. ,
Shape.

568

15.

Rectangle
RectangleGeometry Rect,
. Rectangle

WPF. Width Height,
( ) FrameworkElement, , ,
Canvas.Left Canvas.Top.
, RectangleGeometry, Rectangle
RadiusX RadiusY double,
. .15.16
StackPanel RadiusX RadiusY:
<StackPanel>
<Rectangle Width="200" Height="100"
Fill="Orange" Stroke="Black" StrokeThickness="10" Margin="4"/>
<Rectangle Width="200" Height="100" RadiusX="10" RadiusY="30"
Fill="Orange" Stroke="Black" StrokeThickness="10" Margin="4"/>
<Rectangle Width="200" Height="100" RadiusX="30" RadiusY="10"
Fill="Orange" Stroke="Black" StrokeThickness="10" Margin="4"/>
<Rectangle Width="200" Height="100" RadiusX="100" RadiusY="50"
Fill="Orange" Stroke="Black" StrokeThickness="10" Margin="4"/>
</StackPanel>

RadiusX Width , Ra
diusY Height.
.

RadiusX=10, RadiusY=30

RadiusX=30, RadiusY=10

.15.16.
RadiusX RadiusY

Shape

569

Shape , Stroke
Fill!
, GeometryDrawing,
, , Shape
, Button ListBox, .
Shape Geometry,
Stroke Fill null.

Ellipse
Rectangle ,
( ), , , , Ellipse
. ! Ellipse
.
,
Shape . EllipseGeometry,
RadiusX, RadiusY Center, Ellipse
.
Ellipse
Rectangle XAML, .15.16
:
<Ellipse Width="200" Height="100"
Fill="Orange" Stroke="Black" StrokeThickness="10" Margin="4"/>

RadiusX RadiusY.


Shape
Shape OnRender UIElement
DrawingContext.
, Ellipse OnRender
:
protected override void OnRender(DrawingContext drawingContext)
{
Pen pen = ...; // StrokeXXX
Rect rect = ...; //
drawingContext.DrawGeometry(this.Fill, pen, new EllipseGeometry(rect));
}

Rectangle OnRender :

570

15.

protected override void OnRender(DrawingContext drawingContext)


{
Pen pen = ...; // StrokeXXX
Rect rect = ...; //
drawingContext.DrawRoundedRectangle(this.Fill, pen, rect,
this.RadiusX, this.RadiusY);
}

Shape ,
. 21.

Line
Line double,
, (x1,y1) (x2,y2). X1, Y1,
X2, Y2. ,
Point ( LineGeometry),
.
, Line, ,
, Line
. , StackPanel ,
.15.17:
<StackPanel>
<Line X1="0" Y1="0" X2="100" Y2="100" Stroke="Black"
StrokeThickness="10" Margin="4"/>
<Line X1="0" Y1="0" X2="100" Y2="0" Stroke="Black"
StrokeThickness="10" Margin="4"/>
<Line X1="0" Y1="100" X2="100" Y2="0" Stroke="Black"
StrokeThickness="10" Margin="4"/>
</StackPanel>

(0,0) (100,100)
(0,0) (100,0)
(0,100) (100,0)

.15.17. StackPanel ,

,
, 10
( Stroke) Margin. Line

Shape

571

Shape Fill, ,
.

Polyline
Polyline () ,
Points ( Point). .15.18
Polyline:
<StackPanel>
<Polyline Points="0,0 100,100" Stroke="Black" StrokeThickness="10" Margin="4"/>
<Polyline Points="0,0 100,100 200,0" Stroke="Black"
StrokeThickness="10" Margin="4"/>
<Polyline Points="0,0 100,100 200,0 300,100"
Stroke="Black" StrokeThickness="10" Margin="4"/>
<Polyline Points="0,0 100,100 200,0 300,100 100,100"
Stroke="Black" StrokeThickness="10" Margin="4"/>
</StackPanel>

Point
x y.
.
.

.15.18.
2 5

.15.19. , .15.18,
Fill

.15.19 , Fill Polyline


, PathGeometry,
, ,
. , Polyline
PathGeometry! 15.19
Fill="Orange" Polyline .15.18.

572

15.

Polygon
Rectangle Ellipse, Polyline
Polygon. Polyline Polygon
, Polygon ,
. ( ,
true IsClosed PathFigure,
PathGeometry.)
Polyline, .15.19,
Polygon, , .15.20.
,
, .15.19. -
Miter ,
( ). 0,
, Stroke
MiterLimit 10 .

.15.20. Polygon Polyline,


, Polygon Polyline, FillRule


PathGeometry FillRule.

Path
, , , Shape
Path ,
PathGeometry. Path
Shape Data,

Shape

573

. , Path (
)

. Drawing
DrawingContext;
Data, Fill , Stroke.
Path ,
.15.6:
<Path Fill="Orange" Stroke="Black" StrokeThickness="10">
<Path.Data>
<PathGeometry>
<!-- 1 -->
<PathFigure IsClosed="True">
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
<!-- 2 -->
<PathFigure StartPoint="70,0" IsClosed="True">
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>

, Geometry,
:
<Path Fill="Orange" Stroke="Black" StrokeThickness="10"
Data="M 0,0 L 0,100 L 100,100 Z M 70,0 L 0,100 L 100,100 Z"/>

, Shape
, 15.1
DrawingImage, 15.2 15.4
DrawingContext. 15.5
, Shape,
Canvas.
DrawingImage, Image, .15.13.
15.5. ,
<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Path Fill="Blue" Data="M 240,250
C 200,375 200,250 175,200
C 100,400 100,250 100,200
C 0,350 0,250 30,130
C 75,0 100,0 150,0
C 200,0 250,0 250,150 Z"/>
<Ellipse Fill="Black" Stroke="White" StrokeThickness="10"

574

15.

Width="40" Height="40" Canvas.Left="75" Canvas.Top="75"/>


<Ellipse Fill="Black" Stroke="White" StrokeThickness="10"
Width="40" Height="40" Canvas.Left="150" Canvas.Top="85"/>
<Line X1="75" Y1="160" X2="175" Y2="150" StrokeStartLineCap="Round"
StrokeEndLineCap="Round" Stroke="Black" StrokeThickness="10"/>
</Canvas>

Path () Line () ,
DrawingImage.
EllipseGeometry Ellipse .
15 10.
,
20 . 15.5
Ellipse Height Width, 40 (,
2). Shape
. ,
Canvas.Left Canvas.Top, EllipseGeometry Center
20.
,
(
!),
UIElement.
Visual: ,
,
. ,
, ,
IsEnabled IsVisible ( UIElement) true. (
, ,
,
, .)



-,
Visual. InputHitTest Visual
TreeHelper.HitTest,
! ,
UIElement,
, .

, InputHitTest
UIElement, .
Point, IInputElement (
, UIElement ContentElement).

575

,
UIElement ,
(, ): GotKeyboardFocus,
KeyDown, KeyUp, GotMouseCapture, MouseEnter, MouseLeave, MouseMove, MouseWheel, Got
StylusCapture, StylusEnter, StylusLeave, StylusInAirMove ..
,
Shape Visual.

WPF XAML, ,
WPF
. , ,
(Brush).
, WPF ,
. ,
, (BitmapCacheBrush).

Drawing Window, ,
,
, .


WPF SolidColorBrush, LinearGra
dientBrush RadialGradientBrush. , , ,
,
. ,
.

SolidColorBrush
SolidColorBrush,
, . Color
System.Windows.Media.Color. ,
Blue #FFFFFF SolidColorBrush,
XAML- Color.
Color ,
. :
sRGB RGB, -
-.
, ,
256 .
scRGB RGB, ,
.
.

576

15.

0.0, ;
1.0, . scRGB
, ,
-
. scRGB
, .
Color ( )
: A, R, G, B Byte
sRGB, ScA, ScR, ScG, ScB Single
scRGB. (A ScA -
.)
Color. ,
Color
. ,
sRGB scRGB
.

,
-, Opacity,
.

Color , ,
. ,
scRGB (
),
AreClose, true,
.
Color
:
, Red, Khaki DodgerBlue (
Colors).
sRGB- #argb, a, r, g b
A, R, G, B. ,
#FFFF0000 #FF0000 (
, A 255).
scRGB- sc#a, r g b, a, r, g b
ScA, ScR, ScG, ScB.
sc#1.0 1.0 0.0 0.0 sc#1.0 0.0 0.0.
,
.

577



,
ICC-. (ICC (International Color Consortium)
,
.) Color ,
Color.FromValues,
Single Uri, . XAML
Color,
ContextColor Uri .
, SolidColorBrush
, sRGB-,
system32\spool\drivers\color , Windows:
<Button>
<Button.Background>
<SolidColorBrush Color="ContextColor
file://C:/Windows/system32/spool/drivers/color/sRGB%20Color%20Space%20Profile.icm
1.0,1.0,0.0,0.0"/>
</Button.Background>
</Button>

,
.
. - ,
BitmapSource BitmapCreateOptions.IgnoreColorProfile,
.

LinearGradientBrush
LinearGradientBrush,
, .

.
LinearGradientBrush GradientStops,
GradientStop.
Color Offset. Offset double;

, 0 , 1 . ,
LinearGradientBrush
, , .15.21:
<LinearGradientBrush>
<GradientStop Offset="0" Color="Blue"/>
<GradientStop Offset="1" Color="Red"/>
</LinearGradientBrush>

578

15.

.15.21. -
(. )


.
StartPoint EndPoint LinearGradientBrush.

Offset GradientStop. ,
StartPoint EndPoint (0,0) (1,1) .
,
, MappingMode Absolute (
RelativeToBoundingBox). ,
StartPoint EndPoint;
Offset GradientStop .
. 15.22 , StartPoint
EndPoint LinearGradientBrush,
.15.21 ( MappingMode).
, 0 1.
, ,
. (
GradientStop Offset.)
sRGB,
scRGB, ColorInterpolation
Mode ScRgbLinearInterpolation.
(.15.23).
LinearGradientBrush SpreadMe
thod; , ,
. , LinearGradientBrush
, .
Pad ( Gradi
entSpreadMethod); , ,
. Repeat Reflect.
, Reflect
, .
. 15.24 SpreadMethod -

579

, 10%
:
<LinearGradientBrush StartPoint=".45,.45" EndPoint=".55,.55" SpreadMethod="XXX">
<GradientStop Offset="0" Color="Blue"/>
<GradientStop Offset="1" Color="Red"/>
</LinearGradientBrush>

StartPoint = (0,0),
EndPoint = (0,1)

StartPoint = (0,1),
EndPoint = (0,0)

StartPoint = (0.5,0),
EndPoint = (1,0)

StartPoint = (0,0),
EndPoint = (1,0)

StartPoint = ( 2, 2),
EndPoint = (2,2)

.15.22. StartPoint EndPoint


(. )

SRgbLinearInterpolation

ScRgbLinearInterpolation

.15.23. ColorInterpolationMode
(. )

580

15.

Pad

Repeat

Reflect

.15.24. SpreadMethod
(. )

,
, Drawing, Shape, Control
. . 15.25 ,
GeometryDrawing, , :
<Pen Thickness="20">
<Pen.Brush>
<LinearGradientBrush>
<GradientStop Offset="0" Color="Red"/>
<GradientStop Offset="0.2" Color="Orange"/>
<GradientStop Offset="0.4" Color="Yellow"/>
<GradientStop Offset="0.6" Color="Green"/>
<GradientStop Offset="0.8" Color="Blue"/>
<GradientStop Offset="1" Color="Purple"/>
</LinearGradientBrush>
</Pen.Brush>
</Pen>

, , , ,
GradientStop,
.

.15.25. -
(. )

581

,
GradientStop Offset,
Color. 0.2 0.6
, ,
DarkBlue:
<LinearGradientBrush EndPoint="0,1">
<GradientStop Offset="0" Color="Aqua"/>
<GradientStop Offset="0.2" Color="Blue"/>
<GradientStop Offset="0.2" Color="DarkBlue"/>
<GradientStop Offset="0.6" Color="DarkBlue"/>
<GradientStop Offset="0.6" Color="Blue"/>
<GradientStop Offset="1" Color="Aqua"/>
</LinearGradientBrush>

.15.26 .

.15.26. ,
Offset (. )

RadialGradientBrush
RadialGradientBrush LinearGradientBrush,
,
. Gra
dientBrush, GradientStops, SpreadMethod, ColorIn
terpolationMode MappingMode, LinearGra
dientBrush.
.15.27
- :
<RadialGradientBrush>
<GradientStop Offset="0" Color="Blue"/>
<GradientStop Offset="1" Color="Red"/>
</RadialGradientBrush>

582

15.

.15.27. -
(. )

,
, .
, SpreadMethod, Repeat
(.15.28).

.15.28. SpreadMethod Repeat,


(. )

Radi
alGradientBrush Center, RadiusX RadiusY.
(0.5,0.5), 0.5 0.5 ,
.

( .15.28),
, SpreadMethod, .
RadialGradientBrush GradientOrigin,

. ,
. (0.5,0.5),
, .15.29 , ,
(0,0):
<RadialGradientBrush GradientOrigin="0,0" SpreadMethod="Repeat">
<GradientStop Offset="0" Color="Blue"/>

583

<GradientStop Offset="1" Color="Red"/>


</RadialGradientBrush>

.15.29.
GradientOrigin (. )

MappingMode, Absolute,
- (Center, RadiusX, RadiusY, GradientOri
gin) ,
.
Color -,
, -
GradientStop. , -
-:
<RadialGradientBrush RadiusX="0.7" RadiusY="0.7">
<GradientStop Offset="0" Color="#990000FF"/>
<GradientStop Offset="1" Color="#000000FF"/>
</RadialGradientBrush>

.15.30 (
!) , ,
.

.15.30. ,
- (. )

584

15.

, !
, GradientStop .15.30
, Transparent. , Tran
sparent - (#00FFFFFF).
, -.
GradientStop Transparent,
0x99 0,
0 0xFF. .


WPF ,
TileBrush.
.
Drawing, Image Visual.
,
.
DrawingBrush.
: ImageBrush VisualBrush.

DrawingBrush
Drawing DrawingBrush
DrawingImage. XAML-
DrawingGroup 15.1
Drawing DrawingImage,
:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="DrawingBrush as the Background">
<Window.Background>
<DrawingBrush>
<DrawingBrush.Drawing>
<DrawingGroup>
GeometryDrawing 15.1...
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Window.Background>
</Window>

. 15.31 . DrawingImage,
DrawingBrush ,
.

585

.15.31. , DrawingBrush,

(
, ),
Stretch,
, Stretch (
5 Viewbox).
.15.32 .

None

Fill ( )

Uniform

UniformToFill

.15.32. DrawingBrush Stretch

586

15.

Stretch Fill, Drawing


.
AlignmentX Left, Center Right AlignmentY Top,
Center Bottom.
DrawingBrush ,
, TileMode. Tile
None, Drawing
.
Rect, .
Viewport DrawingBrush. .15.33
, , Viewport
( x, y, , ,
Rect). , .15.33
ScaleTransform
!
, Viewport
.
, ,
.
, ViewportUnits (
BrushMappingMode).

Viewport = 0, 0, 0.5, 0.5

Viewport = 0, 0, 0.1, 0.2

Viewport = 0, 0, 0.02, 0.02


.15.33. Viewport TileMode=Tile Stretch=Fill

587

TileMode, TileMode,
Tile None. ,
:
FlipX
.
FlipY
.
FlipXY .
.15.34 .
,
.
, , Viewbox,
( , TileMode
None) Drawing. Viewbox
,
, Viewport. ViewboxUnits
Viewbox
ViewportUnits.

FlipX

FlipY

FlipXY
.15.34. ,
TileMode

588

15.

.15.35 Viewbox
Drawing, Rect 0, 0, 0.5, 0.5.
TileMode.

Tile

FlipXY

.15.35. Viewbox ,
.
TileMode

DrawingBrush: ,
Drawing GeometryDrawing.
, , VideoDrawing!

ImageBrush
ImageBrush DrawingBrush , :
ImageSource ImageSource, Drawing Drawing.
, . (
, DrawingImage ImageDrawing,
, DrawingBrush ,
ImageBrush !)
XAML- ImageBrush
Window. Winter Leav
es.jpg, Windows Vista:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="ImageBrush with TileMode = FlipXY">
<Window.Background>
<ImageBrush TileMode="FlipXY" Viewport="0,0,0.1,0.2">
<ImageBrush.ImageSource>
<BitmapImage UriSource="C:\Users\Public\Pictures\Sample Pictures\Winter
Leaves.jpg"/>
</ImageBrush.ImageSource>
</ImageBrush>
</Window.Background>
</Window>

589

.15.36 .

.15.36. ImageBrush TileMode=FlipXY


VisualBrush
VisualBrush DrawingBrush , ,
Drawing Drawing Visual Visual.
Visual,
FrameworkElement, Button TextBox, Visu
alBrush .
XAML- VisualBrush,
Button. .15.37
.
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="ImageBrush with TileMode = FlipXY">
<Window.Background>
<VisualBrush TileMode="FlipXY" Viewport="0,0,0.5,0.5">
<VisualBrush.Visual>
<Button>OK</Button>
</VisualBrush.Visual>
</VisualBrush>
</Window.Background>
</Window>

, Button VisualBrush . Visual


Brush Visual,
.

590

15.

.15.37. VisualBrush

VisualBrush,
Visual UIElement,
.
, ,
:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="VisualBrush with TileMode = FlipXY">
<DockPanel>
<StackPanel Margin="10" x:Name="stackPanel">
<Button>Button</Button>
<CheckBox>CheckBox</CheckBox>
</StackPanel>
<Rectangle>
<Rectangle.Fill>
<VisualBrush TileMode="FlipXY" Viewport="0,0,0.5,0.5"
Visual="{Binding ElementName=stackPanel}"/>
</Rectangle.Fill>
</Rectangle>
</DockPanel>
</Window>

.15.38 .
Visual VisualBrush StackPanel,
. VisualBrush
Rectangle, .
, , ,
.
, Button CheckBox,
.
, ,
!
. VisualBrush,

591

(,
) . Internet Explorer ( 7)
(Quick Tabs). , Windows
, VisualBrush,
,
,
Alt+Tab Windows+Tab.

.15.38. Visual VisualBrush

VisualBrush
. TextBox
, ,
XAML:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBox with Reflection" Width="500" Height="200" Background="DarkGreen">
<StackPanel Margin="40">
<TextBox x:Name="textBox" FontSize="30"/>
<Rectangle Height="{Binding ElementName=textBox, Path=ActualHeight}"
Width="{Binding ElementName=textBox, Path=ActualWidth}">
<Rectangle.Fill>
<VisualBrush Visual="{Binding ElementName=textBox}"/>
</Rectangle.Fill>
<Rectangle.LayoutTransform>
<ScaleTransform ScaleY="-0.75"/>
</Rectangle.LayoutTransform>
</Rectangle>
</StackPanel>
</Window>

Rectangle, VisualBrush,
ScaleTransform.
ScaleY -1, -0.75,
. .15.39.

592

15.

.15.39.

,
. ,
, .


Visual ( DrawingGroup) Opacity,
. ,
, OpacityMask,
, . OpacityMask
, -
, ,
, ,
.
-, OpacityMask,
, DrawingBrush,
ImageBrush (, PNG-
) .. Window -
OpacityMask -
, .15.40:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="LinearGradientBrush OpacityMask">
<Window.Background>
<LinearGradientBrush>
<GradientStop Offset="0" Color="Orange"/>
<GradientStop Offset="1" Color="Brown"/>
</LinearGradientBrush>
</Window.Background>
<Button Margin="40" FontSize="80">OK
<Button.OpacityMask>
<LinearGradientBrush EndPoint="0.1,0.1" SpreadMethod="Reflect">
<GradientStop Offset="0" Color="Blue"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Button.OpacityMask>
</Button>
</Window>

593

.15.40. ,
LinearGradientBrush

- ,
,
, ,
. , .
.15.41 , , Opa
cityMask DrawingBrush,
.
. , Button
Geometry, .
,
. .

.15.41. DrawingBrush
OpacityMask;


( AllowsTransparency true ),
7 ,
OpacityMask !

594

15.

, , OpacityMask,
, .15.39:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBox with Reflection" Width="500" Height="200"
Background="DarkGreen">
<StackPanel Margin="40">
<TextBox x:Name="textBox" FontSize="30"/>
<Rectangle Height="{Binding ElementName=textBox, Path=ActualHeight}"
Width="{Binding ElementName=textBox, Path=ActualWidth}">
<Rectangle.Fill>
<VisualBrush Visual="{Binding ElementName=textBox}"/>
</Rectangle.Fill>
<Rectangle.LayoutTransform>
<ScaleTransform ScaleY="-0.75"/>
</Rectangle.LayoutTransform>
<Rectangle.OpacityMask>
<LinearGradientBrush EndPoint="0,1">
<GradientStop Offset="0" Color="Transparent"/>
<GradientStop Offset="1" Color="#77000000"/>
</LinearGradientBrush>
</Rectangle.OpacityMask>
</Rectangle>
</StackPanel>
</Window>

. 15.42 . ,
OpacityMask ,
.

.15.42. ,

WPF ,
Visual. System.Windows.Media.Ef
fects. DropShadowEffect BlurEffect,

595

Effect. .15.43
Button. WPF
.
(BlurEffect)

.15.43.

Visual
VisualEffect, (, UIElement)
Effect. ,
Effect Effect.
, .15.43 :
<Button Width="200">
DropShadowEffect
<Button.Effect>
<DropShadowEffect/>
</Button.Effect>
</Button>

BitmapEffect!
WPF ,
BitmapEffect. , Effect,
BitmapEffect,
BitmapEffect. ,
.
Effect BitmapEffect ,
Effect , Bitmap
Effect .
, BitmapEffect,
BlurEffect DropShadowEffect . ,
BitmapEffect BevelBitmapEffect, EmbossBitmapEffect Outer
GlowBitmapEffect .
, BitmapEffect ,
WPF. , , ,

. , ,
, , .

.

596

15.

.15.43
.
.
.15.3.
WPF
, ShaderEffect, Effect,
. (
, BitmapEffect,
C++ COM.)
ShaderEffect,
, Effect.
DirectX,
, High Level Shader
Language (HLSL).

, ShaderEffect,
WPF Pixel Shader Effects Library http://wpffx.codeplex.
com. , :
BandedSwirlEffect
BloomEffect
BrightExtractEffect
ColorKeyAlphaEffect
ColorToneEffect
ContrastAdjustEffect
DirectionalBlurEffect
EmbossedEffect
GloomEffect
GrowablePoissonDiskEffect
InvertColorEffect
LightStreakEffect

MagnifyEffect
MonochromeEffect
PinchEffect
PixelateEffect
RippleEffect
SharpenEffect
SmoothMagnifyEffect
SwirlEffect
ToneEffect
ToonEffect
ZoomBlurEffect

:
BandedSwirlTransitionEffect
BlindsTransitionEffect
BloodTransitionEffect
CircleRevealTransitionEffect
CircleStretchTransitionEffect
CircularBlurTransitionEffect
CloudReveralTransitionEffect
CloudyTransitionEffect
CrumbleTransitionEffect
DissolveTransitionEffect
DropFadeTransitionEffect
FadeTransitionEffect
LeastBrightTransitionEffect
LineRevealTransitionEffect
MostBrightTransitionEffect

PixelateInTransitionEffect
PixelateOutTransitionEffect
PixelateTransitionEffect
RadialBlurTransitionEffect
RadialWiggleTransitionEffect
RandomCircleRevealTransitionEffect
RippleTransitionEffect
RotateTransitionEffect
SaturateTransitionEffect
ShrinkTransitionEffect
SlideInTransitionEffect
SmoothSwirlTransitionEffect
SwirlTransitionEffect
WaterTransitionEffect
WaveTransitionEffect

597

15.3.

DropShadowEffect

RenderingBias ( Performance
): Performance (
) Quality ()
BlurRadius ( ): 5
double
Color: ( Black
-)
Direction: double, 315

Opacity: double 0 ( 1
) 1 ( )
ShadowDepth ( ): 5
double

BlurEffect

RenderingBias: Performance Quality

Performance

Radius: double 5
KernelType ( ): Box Gaussian Gaussian


,
.
( DrawingContext,
Visual),
.
,
,
.
.
WPF . Ren
derTargetBitmap, WPF. Bitmap
Cache BitmapCacheBrush
.
, WPF4.

RenderTargetBitmap
RenderTargetBitmap, BitmapSource (,
, ImageSource), Visual

598

15.

, Visual.
, Visual.
RenderTargetBitmap,
Visual:
private static ImageSource ProduceImageSourceForVisual(
Visual source, double dpiX, double dpiY)
{
if (source == null)
return null;
Rect bounds = VisualTreeHelper.GetDescendantBounds(source);
RenderTargetBitmap bitmap = new RenderTargetBitmap(
(int)(bounds.Width * dpiX / 96), (int)(bounds.Height * dpiY / 96),
dpiX, dpiY, PixelFormats.Pbgra32);
DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext ctx = drawingVisual.RenderOpen())
{
ctx.DrawRectangle(new VisualBrush(source), null,
new Rect(new Point(), bounds.Size));
}
bitmap.Render(drawingVisual);
return bitmap;
}

Visual VisualBrush ,
. Visual
,
.

BitmapCache
RenderTargetBitmap ,
:




WPF4
, , RenderTargetBitmap!
BitmapCache UIEle
ment
.
XAML-. ,
RenderTargetBitmap,
.

599

,
CacheMode UIElement, .
CacheMode CacheMode,
WPF BitmapCache.
, Grid :
<Grid ...>
<Grid.CacheMode>
<BitmapCache/>
</Grid.CacheMode>
...
</Grid>

( ) , Bit
mapCache .
,
, ! , WPF
,
.
BitmapCache :
RenderAtScale double, 1. ,
.
, .
, ,
, .
RenderAtScale , 1,
.
SnapsToDevicePixels ; true,
.
EnableClearType ; true,
ClearType .
true, true
SnapsToDevicePixels, .
.
.15.44 RenderAtScale
, XAML-:
<Button>
<Button.CacheMode>
<BitmapCache RenderAtScale="..."/>
</Button.CacheMode>
...
</Button>

, Button,
, Button
RenderAtScale .

600

15.

BitmapCache ,
.
20482048
.

RenderAtScale=1

RenderAtScale=0.5

RenderAtScale=0.1

RenderAtScale=0.01

.15.44. RenderAtScale

BitmapCache ,
,
WPF - ,
.
. ,
.

601

BitmapCacheBrush
BitmapCacheBrush
, .
Target BitmapCacheBrush
Visual BitmapCacheBrush ,
Visual CacheMode. , CacheMode
,
BitmapCacheBrush. ( BitmapCacheBrush CacheMode,
BitmapCache BitmapCache, .)
, BitmapCacheBrush Visual
Brush.
,
.

BitmapCacheBrush !
BitmapCacheBrush SnapsToDevicePixels,
, false. EnableClearType
true BitmapCache, BitmapCacheBrush,
CacheMode Visual, Target
BitmapCacheBrush.

,
, . ,
, ,
WPF. Windows, WPF
DirectX ,
.
,
,
. ;
18.
WPF,
. ,
,
, . ,
WPF .



Transform3D
Model3D
Visual3D
Viewport3D

16
16.

API Windows Presentation Fo


undation
, .NET Framework.
( 3D-)
WPF,
.
, ,

. , WPF 3D-.
API,
3D-, ,

. :
, , .
, 3D
, XAML-. WPF
, ,
, Shape Drawing.
,
.
, ,
3D-.

. , Viewport3D,
UIElement, Items
Control. 3D-
, , Drawing Visual.

603

, ,
.
. -,
, . -,
API, WPF. -,
,
, DirectX,
, WPF.



,
, . 3D-
, , ,
.
, ,
.
(50,75) 100 30 , , ,
Rectangle ( GeometryDrawing Rec
tangleGeometry ). 16.1,
Drawing .
.16.1.
16.1. Drawing
<Page Background="Black"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Image>
<Image.Source>
<DrawingImage>
<DrawingImage.Drawing>
<DrawingGroup x:Name="House">
<GeometryDrawing x:Name="Front" Brush="Red"
Geometry="M0,260 L0,600 L110,670 L110,500 L190,550
L190,710 L300,775 L300,430 L150,175"/>
<GeometryDrawing x:Name="Side" Brush="Green"
Geometry="M300,430 L300,775 L600,600 L600,260"/>
<GeometryDrawing x:Name="Roof" Brush="Blue"
Geometry="M150,175 L300,430 L600,260 L450,0"/>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
</Page>

604

16.

.16.1. , Drawing

, ,
, .
.
, ,
, .
, .
(
),
.
16.2 ,
, Model3D Drawing.
16.2 ,
. 3D-,
, ;
.16.2 .
16.2. , 3D-
<Page Background="Black"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Viewport3D>
<Viewport3D.Camera>
<OrthographicCamera Position="5,5,5" LookDirection="-1,-1,-1" Width="5"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D x:Name="Light">
<ModelVisual3D.Content>


<AmbientLight/>
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup x:Name="House">
<GeometryModel3D x:Name="Roof">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Blue"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,1,1 0,2,1 0,2,-1 -1,1,
-1 0,2,1 1,1,1 1,1,-1 0,2,-1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Sides">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Green"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,1,1 -1,1,-1 -1,-1,
-1 -1,-1,1 1,1,-1 1,1,1 1,-1,1 1,-1,-1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Ends">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Red"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="-0.25,0,1 -1,1,1 -1,-1,1 -0.25,-1,1 -0.25,0,1
-1,-1,1 0.25,0,1 1,-1,1 1,1,1 0.25,0,1 0.25,-1,
1 1,-1,1 1,1,1 0,2,1 -1, 1,1 -1,1,1 -0.25,0,
1 0.25,0,1 1,1,1 1,1,-1 1,-1,-1 -1,-1,-1 -1,
1,-1 1,1,-1 -1,1,-1 0,2,-1"
TriangleIndices="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
15 17 18 19 20 21 19 21 22 23 24 25"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Page>

605

606

16.

.16.2.

16.2 ,
. ,
, 15 . .16.1

.
16.1.

Drawing

Model3D

Drawing
, ,

Visual.
Model3D
,
Visual3D.

Geometry

Geometry3D

Geometry
.
,
.
Geometry .
Geom etryDrawing Geo
metry Brush
.
Geometry3D
. Geomet
ry3D,
Material GeometryModel3D.

Visual

Visual3D

Visual ,
.
DrawingVisual ,
FrameworkElement, Control
Shape.
Visual3D ,
. Model
Visual3D Visual3D,
,
Model3D.

607

UIElement

UIElement3D

UIElement Visual,
,
WPF
. , UIElement
1 (LIFE layout, input, focus, even
ting , , , )
.
UIElement3D UIEle
ment, IFE (input, focus, eventing
, , ) 3D.

,

.

Transform

Transform3D

Transform
,
Drawing Visual.
16.2 Transform3D,

, ,

Model3D Visual3D.

3D- API,
, ; 16.2
:1
Camera 3D-
. ,
, .
Material Light

. ,
.
, ,
3D-.


, ,
, .. WPF ,
Viewport3D, 3D-
1

: LIFE life . . .

608

16.

( Camera).
(
). .16.3
, WPF.

2D

3D

.16.3.

z
.
y , . ,
,
, 3D.
, . ,
,
.
Camera OrthographicCamera Per
spectiveCamera
.
, ,
3D- .

Position
Position .
, . Position Point3D.
Point3D x, y, z
. 16.2
(5,5,5):
<Viewport3D.Camera>
<OrthographicCamera Position="5,5,5" LookDirection="-1,-1,-1" Width="5"/>
</Viewport3D.Camera>

609


WPF

z xy. x y
, .16.4, z
. z
, .
z , .

.16.4.
WPF .
:
x,
y,
z (.16.5).

.16.5.
, .

MeshGeometry3D.

610

16.

,
x, y z.
.16.6 , -
. (
,
.)

.16.6. ,
-

- ,
(-5,5,5):
<Viewport3D.Camera>
<OrthographicCamera Position="-5,5,5" LookDirection="-1,-1,-1" Width="5"/>
</Viewport3D.Camera>

.16.7.

.16.7. ,
-

,
. ,

611

, ,
10 . ,
. LookDirection ,
.

LookDirection
LookDirection , .
Vector3D. Point3D, Vector3D
x, y, z, ,
. Vector3D
Length :
x2 + y2 + z2 .

!
, , NearPlaneDis
tance, . Position
,
, NearPlaneDistance, . .16.8
, , .
NearPlaneDistance Camera ,
Z-
. Z- , ,
Z- (Z-fighting),
, . .16.9
,
. .
Z-
, . NearPlaneDistance
Camera Z-,
, . NearPlaneDistance
0.125, .
, ,
Z-. ,
. FarPlaneDistance,
, ,
.
, Z- ,
, , .

, , , .
,
. ,
, .

612

16.

.16.8. -

.16.9.
Z-

Camera 16.2 LookDirection <-1,-1,-1>:


<Viewport3D.Camera>
<OrthographicCamera Position="5,5,5" LookDirection="-1,-1,-1" Width="5"/>
</Viewport3D.Camera>

x, y, z , ,
-, .16.10.
, (-5,5,5),
. . 16.11 .
LookDirection,
.

.16.10.
-

.16.11.

613

LookDirection , - , ,
Position Camera.
(0,0,0). (-5,5,5)
(0,0,0) <5,-5,-5>, .16.12.

.16.12.

LookDirection ,
.16.13:
<Viewport3D.Camera>
<OrthographicCamera Position="-5,5,5" LookDirection="5,-5,-5" Width="5"/>
</Viewport3D.Camera>

.16.13.

614

16.

, Vector3D ,
, .
LookDirection <1,-1,-1>, ,
.16.13.
, WPF .
, Vector3D
- ( <0,0,0>),
Point3D.
Vector3D Point3D,
Point3D, (Length) ,
. ,
. , Vec
tor3DAnimation .

,
, LookDirection
, :
private void LookAt(ProjectionCamera camera, Point3D lookAtPoint)
{
camera.LookDirection = lookAtPoint - camera.Position;
}

UpDirection
LookDirection , ,
.

, .16.14.
.
,
UpDirection ( ).

.16.14. UpDirection

615

UpDirection <0,1,0>. ,
<1,0,0>, , , . .16.15
, UpDirection.
<Viewport3D.Camera>
<OrthographicCamera Position="5,5,5" LookDirection="-1,-1,-1"
UpDirection="1,0,0" Width="5"/>
</Viewport3D.Camera>

.16.15.
x UpDirection


Position, UpDirection LookDirection.
, ,
,
Camera.Transform.

Camera.Transform , ,
, ,
Transform3D.

Camera.Transform ,
,
3D- . ,
Transform3D.

616

16.

UpDirection!

180, , ,
, UpDirection. ,
LookDirection UpDirection,
.16.16.
, LookDirection
, .
, , .
UpDirection -
y,
. , ,
, LookDirection UpDirection
.
UpDirection LookDirection, .16.17.

.16.16.

617

.16.17.

OrthographicCamera PerspectiveCamera
WPF , .
PerspectiveCamera ,
, , ,
, .
. , OrthographicCamera,
,
,
.
. .16.18
,
.

3D- , ,
.
, ,
.16.19.

618

16.

.
OrthographicCamera.Width.
Viewport3D , 1:1.
:
<Viewport3D.Camera>
<OrthographicCamera Position="5,5,5" LookDirection="-1,-1,-1" Width="5"/>
</Viewport3D.Camera>

.16.18.

.16.19.

619

.
,
. ,
.16.20.
,
.
FieldOfView. WPF
. :
<Viewport3D.Camera>
<PerspectiveCamera Position="5,5,5" LookDirection="-1,-1,-1" FieldOfView="45""/>
</Viewport3D.Camera>

FieldOfView
.
Width. Width FieldOfView,
3D- . Width FieldOfView,
.

.16.20.

620

16.


MatrixCamera
WPF , MatrixCamera,
Matrix3D.
,
.
MatrixCamera , ,
Direct3D. MatrixCamera
, WPF ,
.
, MatrixCamera, Direct3D.

, D3DX.
DirectX SDK.

Transform3D
Transform , Transform3D
, 3D-.
Transform3D Model3D, ModelVisual3D Camera.
Transform.
Transform 3D-
. ,
,
Canvas.Left Canvas.Top.
.16.21 15.

. TranslateTransform
,
. .16.21.
TranslateTransform
Visual , .
,
. Canvas
TranslateTransform
Visual.
. 3D-
.
, 3D-
, Transform3D:
TranslateTransform3D 3D-
.

621

Transform3D

.16.21.
ScaleTransform3D 3D-

.
RotateTransform3D 3D- .
MatrixTransform3D 3D-, Mat
rix3D.
Transform3DGroup Transform3D. Trans
form3DGroup Transform3D
3D-.
,
. 16.3 XAML-,
, . -,
( , ), -,
Width ,
.
16.3.
<Page Background="Black"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Viewport3D>
<Viewport3D.Camera>
<OrthographicCamera Position="5,5,5" LookDirection="-1,-1,-1" Width="10"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D x:Name="Light">
<ModelVisual3D.Content>
<AmbientLight/>
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Transform>

622

16.

<x:Static Member="Transform3D.Identity"/>
</ModelVisual3D.Transform>
<ModelVisual3D.Content>
<Model3DGroup x:Name="House">
<GeometryModel3D x:Name="Roof">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Blue"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,1,1 0,2,1 0,2,-1 -1,1,
-1 0,2,1 1,1,1 1,1,-1 0,2,-1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Sides">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Green"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,1,1 -1,1,-1 -1,-1,
-1 -1,-1,1 1,1,-1 1,1,1 1,-1,1 1,-1,-1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Ends">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Red"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="-0.25,0,1 -1,1,1 -1,-1,1 -0.25,-1,
1 -0.25,0,1 -1,-1,1 0.25,0,1 1,-1,1 1,1,
1 0.25,0,1 0.25,-1,1 1,-1,1 1,1,1 0,2,1 -1,
1,1 -1,1,1 -0.25,0,1 0.25,0,1 1,1,1 1,1,
-1 1,-1,-1 -1,-1,-1 -1,1,-1 1,1,-1 -1,1,
-1 0,2,-1"
TriangleIndices="0 1 2 3 4 5 6 7 8 9 10 11 12 13
14 15 16 17 15 17 18 19 20 21 19 21 22 23 24 25"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Page>

Transform3D

623

TranslateTransform3D
TranslateTransform3D
. OffsetX, OffsetY
OffsetZ. , OffsetZ = 3,
z , .16.22:
<ModelVisual3D.Transform>
<TranslateTransform3D OffsetZ="3"/>
</ModelVisual3D.Transform>

.16.22. z

, 3D-
, . ,
.
(3,2,1),
:
<ModelVisual3D.Transform>
<TranslateTransform3D OffsetX="3" OffsetY="2" OffsetZ="1"/>
</ModelVisual3D.Transform>

ScaleTransform3D
ScaleTransform3D ,
3D-.
ScaleX, ScaleY ScaleZ.
, ScaleTransform3D
. ,
x (.16.23):
<ModelVisual3D.Transform>
<ScaleTransform3D ScaleX="2"/>
</ModelVisual3D.Transform>

624

16.

.16.23. x

3D- , Sca
leX, ScaleY ScaleZ .
. 2,
, 0.5 .

, 1, 0!
,
1:1, 1:0. ScaleX, ScaleY ScaleZ, 0,
.
,
.
, !

, .
, .
. .16.23
, .
, (3,0,0),
0.5,
(1.5,0,0),
. XAML-
.16.24:
<ModelVisual3D.Transform>
<Transform3DGroup>
<TranslateTransform3D OffsetX="3"/>
<ScaleTransform3D ScaleX="0.5" ScaleY="0.5" ScaleZ="0.5"/>
</Transform3DGroup>
</ModelVisual3D.Transform>

Transform3D

625

.16.24. ,


,
. CenterX, CenterY CenterZ.
XAML- .
<ModelVisual3D.Transform>
<Transform3DGroup>
<TranslateTransform3D OffsetX="3"/>
<ScaleTransform3D ScaleX="0.5" ScaleY="0.5" ScaleZ="0.5" CenterX="3"/>
</Transform3DGroup>
</ModelVisual3D.Transform>

, .16.25.

.16.25.

626

16.

<ModelVisual3D.Transform>
<Transform3DGroup>
<ScaleTransform3D ScaleX="0.5" ScaleY="0.5" ScaleZ="0.5"/>
<TranslateTransform3D OffsetX="3"/>
</Transform3DGroup>
</ModelVisual3D.Transform>

, ,

, , .
,
x.
.16.24, , , ,

. ,
.
. .16.26 ,
ScaleZ
xy:
<ModelVisual3D.Transform>
<Transform3DGroup>
<TranslateTransform3D OffsetZ="3"/>
<ScaleTransform3D ScaleZ="-1"/>
</Transform3DGroup>
</ModelVisual3D.Transform>

.16.26. z

, z.
, OffsetZ
.

Transform3D

627



CenterX, CenterY CenterZ
,
.
, .

, x, y, z. Rotati
onTransform3D ,
.
,
, .

RotateTransform3D
RotateTransform3D 3D-
. Rotation3D.
:
AxisAngleRotation3D Axis Angle,
.
.
QuaternionRotation3D Quaternion.

,
.

FAQ
WPF -
?
WPF ,
,
. 0 360,
Rotation3DAnimation
,
. , 179,9999,
,
.

Axis/Angle, 3D-
.
Angle DoubleAnimation.

628

16.

Quaternion ,
,
.
,
Axis/Angle,
, AxisAngleRotation3D QuaternionRotation3D
Rotation3D.
Rotation3D Rotation3DAnimation,
.
WPF ,
.
. ,
, .
WPF EulerAngleRotation3D,
Transform3D, Transform3DGroup
RotateTransform3D, XAML-:
<Transform3DGroup>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="RotateX" Axis="1,0,0" Angle="0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="RotateY" Axis="0,1,0" Angle="0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="RotateZ" Axis="0,0,1" Angle="0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>

, , ,
.

.16.27 45 y:
<ModelVisual3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,1,0" Angle="45"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</ModelVisual3D.Transform>

Transform3D

629

.16.27. 45 y

, x z .
, ,
, ScaleTransform3D:
<ModelVisual3D.Transform>
<Transform3DGroup>
<TranslateTransform3D OffsetZ="3"/>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,1,0" Angle="45"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>
</ModelVisual3D.Transform>


. .
, ,
.16.28.

.16.28.

630

16.

, ,
CenterX, CenterY CenterZ:
<ModelVisual3D.Transform>
<Transform3DGroup>
<TranslateTransform3D OffsetZ="3"/>
<RotateTransform3D CenterZ="3">
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,1,0" Angle="45"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>
</ModelVisual3D.Transform>


. ,
.
<ModelVisual3D.Transform>
<Transform3DGroup>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,1,0" Angle="45"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<TranslateTransform3D OffsetZ="3"/>
</Transform3DGroup>
</ModelVisual3D.Transform>

Transform3D
,
, 3D-
: , ( ,
).
Transform3DGroup. XAML-
Transform3DGroup:
<Transform3DGroup>
<ScaleTransform3D x:Name="Size" ScaleX="1" ScaleY="1" ScaleZ="1"/>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="Orientation" Axis="0,1,0" Angle="0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<TranslateTransform3D x:Name="Position" OffsetX="0" OffsetY="0" OffsetZ="0"/>
</Transform3DGroup>

Model3D

631


MatrixTransform3D
WPF Transform3D: MatrixTrans
form3D.
Matrix3D. ,
, Matrix3D 44. ,
, , .
MatrixTransform3D ,
Transform3D, ,
.
, Transform3D
Matrix3D Value.
Transform3DGroup, ,
Transform3D MatrixTransform3D.

Model3D
Model3D ,
. Model3D Drawing .
Drawing
WPF-
, Model3D 3D- WPF.
WPF Model3D:
Light , .
, Light Model3D,
, ,
Model3DGroup.

XAML-
, 3D-
.

,
. , ,
.
, ,
3D-,
XAML.
, .
3D-, ZAM 3D Electric Rain,
WPF XAML.

632

16.

GeometryModel3D (

Geometry3D) Material. GeometryModel3D


GeometryDrawing .
Model3DGroup Model3D. Model3DGroup
Model3D
GeometryModel3D Light 3D-
.
16.2 16.3,
.

Light
, WPF
. , ,
Brush Pen. 3D
,

.
.
: Light,
; Material, , -
; (Geometry) ,
.
, WPF:
DirectionalLight ( )
, .
, .
PointLight ( )
. .
PointLight ,
.
SpotLight () . PointLight,
. SpotLight
, .
AmbientLight ( ) .
-
.
,
.
, ,
. ,
, WPF, ,
.
,
.

Model3D

633

: (
); ,
. WPF
.
.
,
, ,
.. - .
API
, .

DirectionalLight
DirectionalLight ,
, .
, , . .16.29
, :
<DirectionalLight Direction="1,-1,-0.5" Color="White"/>

, , Direction.
, Transform, Model3D,
. Color.

.16.29. DirectionalLight,

DirectionalLight
. ,

634

16.

( ),
, .
, , AmbientLight,
.

Color . ,
#FFFFFF . #808080
. - .
. , (
Position, Direction ..)
, .

PointLight
PointLight ,
, , ,
. DirectionalLight, ,
PointLight, .
. 16.30
PointLight, :
<PointLight Color="White" Position="2,2,2"
ConstantAttenuation="0"
LinearAttenuation="0"
QuadraticAttenuation="0.125"/>

PointLight Position.

, ConstantAttenuation (
), LinearAttenuation ( ) QuadraticAttenuation (
):
=

1
max(1, C + Ld + Qd2)

C, L, Q ConstantAttenuation, LinearAttenuation Quadratic


Attenuation, d ( Position)
. -
. , C=1, L=0, Q=0,
, .
.
PointLight Range, ,
.
Range ,

Model3D

635

. Range
.

.16.30. PointLight,

SpotLight
SpotLight (PointLight), .
.

. .16.31 , SpotLight
PointLight,
.

.16.31. SpotLight,

636

16.

FAQ
SpotLight PointLight
?
,

. , WPF
.
,
PointLight SpotLight.
.16.32. , .
SpotLight ,
PointLight Range. ,
, .
,
, . 16.33.
, ,
SpotLight .
, .
,
.
,
.16.31, .
, ,
, .
, .

.16.32.

.16.33.

Model3D

637

Direction .
OuterConeAngle InnerConeAngle. :
<SpotLight Color="White" Position="2,2,2"
Direction="-1,-1,-1"
InnerConeAngle="45"
OuterConeAngle="90"/>

InnerConeAngle
, Color. InnerConeAngle Outer
ConeAngle . Inner
ConeAngle OuterConeAngle, .
InnerConeAngle OuterConeAngle,
SpotLight, .

AmbientLight
AmbientLight ,
,
. AmbientLight
, .16.34.
AmbientLight , Color,
. Transform,
Model3D, AmbientLight .

.16.34. AmbientLight,

638

16.

AmbientLight (.
) ,
.16.35:
<AmbientLight Color="White"/>

.16.35. AmbientLight

AmbientLight
, ,
. .16.36
AmbientLight :
<Model3DGroup>
<DirectionalLight Direction="1,-1,-1" Color="White"/>
<AmbientLight Color="#FF333333"/>
</Model3DGroup>

,
: AmbientLight
( #555555 ).
, AmbientLight
, DiffuseMaterial.AmbientColor. ,
AmbientColor, ,
DiffuseMaterial, Ambi
entLight.

639

Model3D

DirectionalLight

AmbientLight

.16.36. AmbientLight

GeometryModel3D
, 3D-, . WPF
Geometry3D.
Geometry3D
.
, Material. GeometryMo
del3D, Model3D,
Geometry Material.
GeometryModel3D,
( MeshGeometry3D) DiffuseMaterial:
<GeometryModel3D>
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Blue"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
TriangleIndices="0 1 2, 0 2 3"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>

,
MeshGeometry3D.

Material
, Light
, . ,
,

640

16.

.
. ,
.
WPF Material ,
.
, WPF:
DiffuseMaterial ( )
, ,
.
SpecularMaterial ( ) ,
.
,
.
EmissiveMaterial ( ) ,
. ,
;
.
. ,
,
, , ,
.
MaterialGroup .
,
.
DiffuseMaterial. . ,
, ,
, .
.16.37 .

.16.37. (. )

641

Model3D

.
,
.16.38. , ,
.
. ,
, ,
.

.16.38.

, , Brush.
.16.37
, .
<DiffuseMaterial Brush="Red"/>

, ,
, . ,
.16.39 ,
ImageBrush:
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="C:\ZebraStripes.png" ViewportUnits="Absolute"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>

, SolidColorBrush,
!
GradientBrush, ImageBrush, DrawingBrush
VisualBrush, ,
.
, .
SolidColorBrush ,
.

. SolidColorBrush , ,
, , .

642

16.

ImageBrush

ImageBrush

.16.39. ImageBrush,
(. )

WPF ,

.
3D-, ,
Drawing,
, DocumentViewer!

,
( UV-)
Geometry. .
.16.39 ImageBrush ,
, , .
.
, ImageBrush.
Color .
.
, .
Color . ,
,
, .

643

Model3D



, , :
n

Lci Mci

Mb

i=0

Lc Color , Mc Color
, Mb . -
Color . -
.

Color
.
, ,
..
Color , ,
. , ,
, .
ImageSource, ;
.16.39 ,
:
<DiffuseMaterial Color="Orange">
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="C:\ZebraStripes.png" ViewportUnits="Absolute"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>

, ,
3D-,
.

FAQ

?
:
ImageSource -,
Brush.Opacity - DiffuseMaterial.
Color. ,
, .

644

16.

, WPF .
, , ,
( ), WPF
, ,
. ,
(
), :
, , ,
. , .
,
, .
, 3D-
, Children.
Children, ,
.

EmissiveMaterial. ,
.
.

FAQ
WPF AmbientMaterial?
, ,
, Di
rect3D 3D-, , , WPF
AmbientMaterial.

(ambient), , ,
.
, ,
AmbientLight
. , ,
AmbientLight,
.
AmbientLight.
WPF AmbientColor DiffuseMaterial.
Color ,
, AmbientLight. AmbientColor
AmbientLight.
, ,
Color DiffuseMaterial,
SpecularMaterial EmissiveMaterial .
AmbientColor DiffuseMaterial.

645

Model3D

EmissiveMaterial. ,
.
. .16.40
:
<EmissiveMaterial Brush="Green"/>

.
,
, , .
. 16.40
. -
, - ( ,
).
, Emis
siveMaterial DiffuseMaterial, MaterialGroup:
<MaterialGroup>
<DiffuseMaterial Brush="Black"/>
<EmissiveMaterial Brush="Green"/>
</MaterialGroup>

.16.40.

EmissiveMaterial

EmissiveMaterial DiffuseMaterial

.16.40. (. )

, ,
. , ,
,
. ,
. ,

646

16.

,
.
SpecularMaterial.
, ,
.
, , .16.41:
<SpecularMaterial Brush="White" SpecularPower="10"/>

SpecularMaterial DiffuseMaterial,
( .16.41):
<MaterialGroup>
<DiffuseMaterial Brush="Red"/>
<SpecularMaterial Brush="White" SpecularPower="40"/>
</MaterialGroup>


.16.37.
SpecularPower.
, .

SpecularMaterial

SpecularMaterial DiffuseMaterial

.16.41. (. )

,
.

.

Model3D

647

, ,
,
. .16.42, Specular
Material, , ,
.

.16.42.

, , AmbientLight ,
.
, ,
, Color
Brush SpecularMaterial Color .
Diffuse
Material .

,
, WPF
Brush. -
, ,
. , (gloss
mapping),
, ..

. ,
MaterialGroup .
EmissiveMaterial SpecularMaterial DiffuseMa
terial, .

Geometry3D
Geometry Geometry3D
. Geometry3D
. Model3D,
, ,
GeometryModel3D. Geometry3D
: MeshGeometry3D.

648

16.

MeshGeometry3D ,
. :
Positions , (
).
TriangleIndices , .
TriangleIndices , ,
0 1 2, 3 4 5 ..
Normals .
TextureCoordinates
, .
Positions, Normals TextureCoordinates ,
. ,
0 Positions,
0 Normals ..
Positions. , ,
.
Positions MeshGeometry3D.
Point3D Positions . ,
, .16.43.
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0"/>

, (.16.44).
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 -1,1,0 1,-1,0 1,1,0"/>

.16.43. ,
MeshGeometry3D

.16.44. ,
MeshGeometry3D

. ,
, ,
, MeshGeometry3D
.
. - ,
Material null. ,

649

Model3D

. .16.45
, , .
.
, 0 1, ,
0 1.
, ,
.16.45.

.16.45.




, z .
, ,
. , ,
, . .16.46,
.

.16.46.

.

650

16.

, - ,
Material BackMaterial ,
, .
,
.
. ,
, BackMaterial,
.

TriangleIndices.
.
.
.
TriangleIndices
. TriangleIndices , ,
,
Positions. ,
TriangleIndices. , , . 16.47,
, :
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
TriangleIndices="0 1 2, 0 2 3"/>


. ,
.
,
,
.

.16.47.

651

Model3D

, TriangleIndices ,
,
MeshGeometry3D, . WPF
, ,
, .
, .
MeshGeometry3D ,
, , -
.
,
.
MeshGeometry3D , ,
.

Normals. ,
. ,
, ,
. .16.48
, 12
.

.16.48. , 12

,
.16.49,

652

16.

. ,
.
, .16.49,
.

.16.49. , .16.48

, ,
, .
,
, ,
.16.48. TriangleIndices ,
,
, .16.48 .

, . ,
,
, .16.50 :
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
TriangleIndices="0 1 2, 0 2 3"
Normals="0,0,1 0,0,1 0,0,1 0,0,1"/>

, ,
,
, .16.50 :
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
TriangleIndices="0 1 2, 0 2 3"
Normals="-0.25,0.25,1 -0.25,-0.25,1 0.25,-0.25,1 0.25,0.25,1"/>

653

Model3D

.16.50.

TextureCoordinates. Fill
Shape ,
, .
. TextureCoordina
tes .

.
. . 16.51 ,
, :
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
TriangleIndices="0 1 2, 0 2 3"
TextureCoordinates="0,0 0,1 1,1 1,0"/>

, WPF ,
, y
. , -
(0,0) (1,1).

.16.51.

654

16.

WPF ,
, , !

WPF.
, 2D3D-.
, ,
.
-, ,
. ,
, , , :
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
TriangleIndices="0 1 2, 0 2 3"
TextureCoordinates="0,0 0,0.5 0.5,0.5 0.5,0"/>

(0,0) (0.5,0.5)
.
, ViewportUnits Absolute:
<ImageBrush ViewportUnits="Absolute" .../>

.


. .
-, ,
y , , WPF.
, ,
, .
:
<ImageBrush ViewportUnits="Absolute" Transform="1,0,0,-1,0,1" .../>

,
0 1, , , .
WPF TileMode :
<ImageBrush ViewportUnits="Absolute" Transform="1,0,0,-1,0,1" TileMode="Tile" .../>

ImageBrush,
, .

Model3DGroup
Model3DGroup Model3D.
Model3D .
GeometryModel3D Model3DGroup ,
. 16.4 ,
GeometryModel3D .

Model3D

655

MeshGeometry3D,
MaterialGroup.

(mesh) ,
, .
. WPF
Model3DGroup, Geomet
ryModel3D, .

16.4.
<Model3DGroup x:Name="Cube">
<GeometryModel3D x:Name="Front">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Orange"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="1,1,1 -1,1,1 -1,-1,1 1,-1,1"
TextureCoordinates="1,1 0,1 0,0 1,0"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Right">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Yellow"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="1,1,-1 -1,1,-1 -1,1,1 1,1,1"
TextureCoordinates="0,0 1,0 1,1 0,1"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Back">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Red"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,-1,-1 -1,1,-1 1,1,-1 1,-1,-1"
TextureCoordinates="1,0 1,1 0,1 0,0"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Left">
<GeometryModel3D.Material>

656

16.

<DiffuseMaterial Brush="Blue"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,1,1 -1,1,-1 -1,-1,-1 -1,-1,1"
TextureCoordinates="1,1 0,1 0,0 1,0"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Top">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Green"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="1,-1,1 1,-1,-1 1,1,-1 1,1,1"
TextureCoordinates="1,1 0,1 0,0 1,0"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
<GeometryModel3D x:Name="Bottom">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Purple"/>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,-1,1 -1,-1,-1 1,-1,-1 1,-1,1"
TextureCoordinates="0,1 0,0 1,0 1,1"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
</Model3DGroup>

Visual3D
, ,
Visual.
Visual3D ,
. Visual ,
Visual3D
VisualTreeHelper.
WPF Visual3D: ModelVisual3D,
UIElement3D Viewport2DVisual3D. .

ModelVisual3D
ModelVisual3D DrawingVisual
WPF . ModelVisual3D
Content:

Visual3D

657

<Viewport3D>
<Viewport3D.Camera>
<OrthographicCamera Position="5,5,5" LookDirection="-1,-1,-1" Width="5"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D Content="{StaticResource CubeModel}"/>
</Viewport3D.Children>
</Viewport3D>

ModelVisual3D Children. Model


Visual3D
Viewport3D:
<Viewport3D>
<Viewport3D.Camera>
<OrthographicCamera Position="5,5,5" LookDirection="-1,-1,-1" Width="5"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D Transform="{DynamicResource SquadronTransform}">
<ModelVisual3D Content="{StaticResource AirplaneModel}"
Transform="{DynamicResource PlaneTransform1}"/>
<ModelVisual3D Content="{StaticResource AirplaneModel}"
Transform="{DynamicResource PlaneTransform2}"/>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>

FAQ
Model3DGroup,
ModelVisual3D?
, , Model3DGroup,
ModelVisual3D ( ModelUIElement3D,
),
. ModelVisual3D ModelUIElement3D
.
, Model3DGroup .
ModelVisual3D
GeometryModel3D . ,
.
Model3DGroup ,
GeometryModel3D .
Model3DGroup
(, ,
), ModelVisual3D ( ModelUIElement3D)
3D- (, ).

658

16.

ModelVisual3D Children ( Content!),


XAML-
. , Model3D
ModelVisual3D.

UIElement3D
WPF3.5 UIElement3D
Visual3D
WPF 3D.
, WPF UIElement ,
LIFE (, , ).
, IFE (, ) UIElement3D
. ,
3D- .
Viewport3D,
, 3D- ,
UIElement3D.
WPF , UIElement3D: ModelUIElement3D
ContainerUIElement3D.
FooBar, , , ModelUIEle
ment3D UIElement3D, Model, ContainerUIElement3D UIEle
ment3D, .

ModelUIElement3D
16.5 16.6 ModelUIElement3D
, . ModelUI
Element3D Model3D, .
, MouseDown ModelUIEle
ment3D, Viewport3D.
16.5. MainWindow.xaml ,
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="3,3,4" LookDirection="-1,-1,-1"
FieldOfView="60"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Direction="-0.3,-0.4,-0.5" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelUIElement3D MouseDown="Cube_MouseDown">

Visual3D

659

<ModelUIElement3D.Model>
<GeometryModel3D>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Purple" x:Name="CubeBrush"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="1,1,-1 1,-1,-1 -1,-1,-1 -1,1,-1 1,1,1 -1,1,1 -1,-1,1 1,-1,1
1,1,-1 1,1,1 1,-1,1 1,-1,-1 1,-1,-1 1,-1,1 -1,-1,1 -1,-1,-1
-1,-1,-1 -1,-1,1 -1,1,1 -1,1,-1 1,1,1 1,1,-1 -1,1,-1 -1,1,1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12 14
15 16 17 18 16 18 19 20 21 22 20 22 23"
TextureCoordinates="0,1 0,0 1,0 1,1 1,1 -0,1 0,-0 1,0 1,1 -0,1 0,-0
1,0 1,0 1,1 -0,1 0,-0 -0,0 1,-0 1,1 0,1 1,-0 1,1
0,1 -0,0" />
</GeometryModel3D.Geometry>
</GeometryModel3D>
</ModelUIElement3D.Model>
</ModelUIElement3D>
</Viewport3D.Children>
</Viewport3D>
</Grid>
</Window>

16.6. MainWindow.xaml.cs ,

using
using
using
using

System;
System.Windows;
System.Windows.Input;
System.Windows.Media;

public partial class MainWindow : Window


{
static Random r;
public MainWindow()
{
InitializeComponent();
r = new Random();
}
private void Cube_MouseDown(object sender, MouseButtonEventArgs e)
{
//
CubeBrush.Color = Color.FromRgb((byte)r.Next(), (byte)r.Next(), (byte)r.Next());
}
}

660

16.

ContainerUIElement3D
ContainerUIElement3D
ModelUIElement3D:
<Viewport3D>
<Viewport3D.Children>
<ContainerUIElement3D>
<ModelUIElement3D ...>
<ModelUIElement3D ...>
</ContainerUIElement3D>
</Viewport3D.Children>
</Viewport3D>

ContainerUIElement3D Model3D,
Children Visual3DCollection .
ModelUIElement3DGroup.
ModelVisual3D UIEle
ment3D. ModelVisual3D Model3D,
Visual3DCollection. UIElement3D
ContainerUIElement3D ModelUIElement3D
.

Viewport2DVisual3D
WPF3.5 Viewport2DVisual3D
2D-
. 2D-
VisualBrush DrawingBrush.
, .
Button, VisualBrush,
. Viewport2DVisual3D :
, , .
TextBox, ,
.
,
. ,
TextBox!
Viewport2DVisual3D , , ,
, WPF.
Visual3D, . ,
, WPF Viewport2D.
16.7 Viewport2DVisual3D
Button. Viewport2DVisual3D MeshGeomet
ry3D, Material Visual.
Viewport2DVisual3D.
IsVisualHostMaterial true.
Brush, . , ,

Visual3D

661

Visual, .
.16.52.
16.7.
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid>
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="0.2,0.1,1" LookDirection="-0.2,-.1,-1"
FieldOfView="120"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Direction="-0.3,-0.4,-0.5" />
</ModelVisual3D.Content>
</ModelVisual3D>
<Viewport2DVisual3D>
<Viewport2DVisual3D.Geometry>
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
TextureCoordinates="0,0 0,1 1,1 1,0"
TriangleIndices="0 1 2 0 2 3" />
</Viewport2DVisual3D.Geometry>
<Viewport2DVisual3D.Material>
<DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" />
</Viewport2DVisual3D.Material>
<Button>Hello, 3D</Button>
</Viewport2DVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Grid>
</Window>

.16.52.

662

16.

Viewport2DVisual3D .
CacheMode, ,
UIElement.


,
, 3D-, ModelUIElement3D
MouseDown. ModelUIElement3D
3D-.
Visual, Visual3D
Visual.
Visual3D,
UIElement, 3D-,
Viewport3D:
<Viewport3D MouseDown="MouseDownHandler">


:
private void MouseDownHandler(object sender, MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
Viewport3D viewport = (Viewport3D)sender;
Point location = e.GetPosition(viewport);
HitTestResult result = VisualTreeHelper.HitTest(viewport, location);
if (result != null && result.VisualHit is Visual3D)
{
MessageBox.Show("Hit Visual3D!");
}
}

, Visual3D 15
VisualTreeHelper.HitTest,
.
3D-,
VisualTreeHelper.HitTest, Visual3D
HitTestParameters3D.

Viewport3D

663



HitTestResult , ,
PointHitTestResult GeometryHitTestResult.
HitTestResult ,
. ,
, 3D-, Hit
TestResult RayMeshGeometry3DHitTestResult.
.

Viewport3D
Viewport3D , Viewport2D
Visual3D. Viewport2DVisual3D Visual3D,
2D 3D, Viewport3D
FrameworkElement, 3D 2D.
Viewport3D , Window
Grid. Viewport3D Visual3D. 3D-
, Visual3D,
, Viewport3D. 3D- Viewport3D
Camera Viewport3D.


(. 21
) ,
. , Button
.
Viewport3D : Viewport3D
3D- ,
. ClipToBounds Viewport3D false,
3D-
. , Viewport3D
, true.
Width Height Viewport3D,
.
, Viewport3D 00 3D-
.

, Viewport3D
FrameworkElement, ,
3D- .

664

16.



3D-. .16.53
Photo Gallery 7
. ,
Button. ,
! .

.16.53. Photo Gallery

16.8.
<!-- ,
. Viewport3D
" ",
Width Height,
. -->
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<ControlTemplate.Triggers>
<!-- -->
<Trigger Property="Button.IsPressed" Value="true">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard TargetName="RotateY" TargetProperty="Angle">
<DoubleAnimation Duration="0:0:1" From="0" To="360"
DecelerationRatio="1.0"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="2.9,2.65,2.9" LookDirection="-1,-1,-1"/>

Viewport3D

665

</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D x:Name="Light">
<ModelVisual3D.Content>
<DirectionalLight Direction="-0.3,-0.4,-0.5"/>
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D x:Name="Cube">
<ModelVisual3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="RotateY" Axis="0,1,0" Angle="0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</ModelVisual3D.Transform>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<!-- VisualBrush Background
Content -->
<VisualBrush ViewportUnits="Absolute" Transform="1,0,0,-1,0,1">
<VisualBrush.Visual>
<Border Background="{Binding Path=Background,
RelativeSource={RelativeSource TemplatedParent}}">
<Label Content="{Binding Path=Content,
RelativeSource={RelativeSource TemplatedParent}}"/>
</Border>
</VisualBrush.Visual>
</VisualBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="1,1,-1 1,-1,-1 -1,-1,-1 -1,1,-1 1,1,1 -1,1,1 -1,-1,1
1,-1,1 1,1,-1 1,1,1 1,-1,1 1,-1,-1 1,-1,-1 1,-1,1 -1,-1,1 -1,-1,-1
-1,-1,-1 -1,-1,1 -1,1,1 -1,1,-1 1,1,1 1,1,-1 -1,1,-1 -1,1,1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12
13 14 12 14 15 16 17 18 16 18 19 20 21 22 20 22 23"
TextureCoordinates="0,1 0,0 1,0 1,1 1,1 0,1 0,-0 1,0 1,1
0,1 0,-0 1,0 1,0 1,1 0,1 0,-0 0,0 1,-0 1,1 0,1 1,-0
1,1 0,1 0,0"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</ControlTemplate>

666

16.

</Setter.Value>
</Setter>
</Style>


Viewport3DVisual
Viewport3D Viewport3DVisual,
. Viewport3D
Visual - ,
Visual, FrameworkElement, Viewport3DVisual
Visual, Visual3D.
Viewport3DVisual , Viewport3D,
Viewport, ,
3D-, Visual
.



WPF
. ,
.
, , ,
.
, ,
.
.
API ,
.

Visual.TransformToAncestor
Visual TransformToAncestor,
GeneralTransform2DTo3D. , Visual Viewport2D
Visual3D.
Visual Visual3D.
16.9 16.10 (0,0), Viewport2D
Visual3D Button, ,
, Point3D,
. ,
, General
Transform2DTo3D. .16.54.

667

.16.54. (0,0), Viewport2DVisual3D,


16.9. MainWindow.xaml

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Viewport3D Panel.ZIndex="0">
<Viewport3D.Camera>
<PerspectiveCamera Position="3,3,4" LookDirection="-1,-1,-1"
FieldOfView="60" />
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Direction="-0.3,-0.4,-0.5" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D x:Name="Container">
<Viewport2DVisual3D>
<Viewport2DVisual3D.Transform>
<Transform3DGroup>
<TranslateTransform3D OffsetX="1.5" />
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="rotationY" Axis="0,1,0" Angle="0" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>
</Viewport2DVisual3D.Transform>
<Viewport2DVisual3D.Geometry>

668

16.

<MeshGeometry3D Positions="1,1,-1 1,-1,-1 -1,-1,-1 -1,1,-1 1,1,1 -1,1,1


-1,-1,1 1,-1,1 1,1,-1 1,1,1 1,-1,1 1,-1,-1
1,-1,-1 1,-1,1 -1,-1,1 -1,-1,-1 -1,-1,-1
-1,-1,1 -1,1,1 -1,1,-1 1,1,1 1,1,-1 -1,1,-1
-1,1,1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12
14 15 16 17 18 16 18 19 20 21 22 20 22 23"
TextureCoordinates="0,1 0,0 1,0 1,1 1,1 -0,1 0,-0 1,0 1,1 -0,1 0,-0
1,0 1,0 1,1 -0,1 0,-0 -0,0 1,-0 1,1 0,1 1,-0 1,1
0,1 -0,0" />
</Viewport2DVisual3D.Geometry>
<Viewport2DVisual3D.Material>
<DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" />
</Viewport2DVisual3D.Material>
<Button Name="TestButton">
<Button.RenderTransform>
<ScaleTransform ScaleY="-1" />
</Button.RenderTransform>
Hello, 3D
</Button>
</Viewport2DVisual3D>
</ModelVisual3D>
<ModelUIElement3D>
<ModelUIElement3D.Transform>
<Transform3DGroup>
<ScaleTransform3D ScaleX="0.2" ScaleY="0.2" ScaleZ="0.2" />
<TranslateTransform3D x:Name="cube_translation" />
</Transform3DGroup>
</ModelUIElement3D.Transform>
<ModelUIElement3D.Model>
<GeometryModel3D>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Purple" />
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="1,1,-1 1,-1,-1 -1,-1,-1 -1,1,-1 1,1,1 -1,1,1 -1,-1,1 1,-1,1
1,1,-1 1,1,1 1,-1,1 1,-1,-1 1,-1,-1 1,-1,1 -1,-1,1 -1,-1,-1
-1,-1,-1 -1,-1,1 -1,1,1 -1,1,-1 1,1,1 1,1,-1 -1,1,-1 -1,1,1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12
14 15 16 17 18 16 18 19 20 21 22 20 22 23"
TextureCoordinates="0,1 0,0 1,0 1,1 1,1 -0,1 0,-0 1,0 1,1 -0,1 0,-0
1,0 1,0 1,1 -0,1 0,-0 -0,0 1,-0 1,1 0,1 1,-0 1,1
0,1 -0,0" />
</GeometryModel3D.Geometry>
</GeometryModel3D>
</ModelUIElement3D.Model>
</ModelUIElement3D>

669

</Viewport3D.Children>
</Viewport3D>
</Grid>
<Window.Triggers>
<EventTrigger RoutedEvent="Window.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="rotationY"
Storyboard.TargetProperty="Angle"
From="0" To="360" Duration="0:0:12"
RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Window.Triggers>
</Window>

16.10. MainWindow.xaml.cs ,

using
using
using
using

System;
System.Windows;
System.Windows.Media;
System.Windows.Media.Media3D;

public partial class MainWindow : Window


{
public MainWindow()
{
InitializeComponent();
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
static TimeSpan lastRenderTime = new TimeSpan();
void CompositionTarget_Rendering(object sender, EventArgs e)
{
//
if (lastRenderTime == ((RenderingEventArgs)e).RenderingTime)
return;
lastRenderTime = ((RenderingEventArgs)e).RenderingTime;
GeneralTransform2DTo3D transform =
TestButton.TransformToAncestor(Container);
Point3D point = transform.Transform(new Point(0, 0));
cube_translation.OffsetX = point.X;
cube_translation.OffsetY = point.Y;
cube_translation.OffsetZ = point.Z;
}
}

670

16.

16.10 CompositionTarget.Rendering ,

. , -

.
, EventArgs
RenderingEventArgs, RenderingTime (
).

Visual3D.TransformToAncestor
Visual3D.TransformToDescendant
Visual3D
. GeneralTransform3DTo2D,
Visual3D.TransformToAncestor,
Visual3D .
,
,
.
16.11 16.12 TransformToAncestor ,
TextBlock ,
.16.55.
16.11. MainWindow.xaml
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid Name="myGrid">
<TextBlock Panel.ZIndex="1" IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_000" />
</TextBlock.RenderTransform>
(-1,-1,-1)
</TextBlock>
<TextBlock Panel.ZIndex="1" IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_001" />
</TextBlock.RenderTransform>
(-1,-1,1)
</TextBlock>
<TextBlock Panel.ZIndex="1" IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_010" />
</TextBlock.RenderTransform>
(-1,1,-1)
</TextBlock>
<TextBlock Panel.ZIndex="1" IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_011" />


</TextBlock.RenderTransform>
(-1,1,1)
</TextBlock>
<TextBlock Panel.ZIndex="1" IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_100" />
</TextBlock.RenderTransform>
(1,-1,-1)
</TextBlock>
<TextBlock Panel.ZIndex="1" IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_101" />
</TextBlock.RenderTransform>
(1,-1,1)
</TextBlock>
<TextBlock Panel.ZIndex="1" IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_110" />
</TextBlock.RenderTransform>
(1,1,-1)
</TextBlock>
<TextBlock Panel.ZIndex="1" IsHitTestVisible="False">
<TextBlock.RenderTransform>
<TranslateTransform x:Name="t_111" />
</TextBlock.RenderTransform>
(1,1,1)
</TextBlock>
<Viewport3D Panel.ZIndex="0">
<Viewport3D.Camera>
<PerspectiveCamera Position="3,3,4" LookDirection="-1,-1,-1"
FieldOfView="60"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Direction="-0.3,-0.4,-0.5" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelUIElement3D x:Name="Cube">
<ModelUIElement3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="rotationY" Axis="0,1,0" Angle="0" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</ModelUIElement3D.Transform>
<ModelUIElement3D.Model>
<GeometryModel3D x:Name="OB_Cube">
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Orange" x:Name="CubeBrush" />

671

672

16.

</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D x:Name="ME_Cube2"
Positions="1,1,-1 1,-1,-1 -1,-1,-1 -1,1,-1 1,1,1 -1,1,1 -1,-1,1
1,-1,1 1,1,-1 1,1,1 1,-1,1 1,-1,-1 1,-1,-1 1,-1,1
-1,-1,1 -1,-1,-1 -1,-1,-1 -1,-1,1 -1,1,1 -1,1,-1 1,1,1
1,1,-1 -1,1,-1 -1,1,1"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14
12 14 15 16 17 18 16 18 19 20 21 22 20 22 23"
TextureCoordinates="0,1 0,0 1,0 1,1 1,1 -0,1 0,-0 1,0 1,1 -0,1
0,-0 1,0 1,0 1,1 -0,1 0,-0 -0,0 1,-0 1,1 0,1
1,-0 1,1 0,1 -0,0"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
</ModelUIElement3D.Model>
</ModelUIElement3D>
</Viewport3D.Children>
</Viewport3D>
</Grid>
<Window.Triggers>
<EventTrigger RoutedEvent="Window.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="rotationY"
Storyboard.TargetProperty="Angle"
From="0" To="360" Duration="0:0:12"
RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Window.Triggers>
</Window>

.16.55.

673

16.12. MainWindow.xaml.cs ,

using
using
using
using
using

System;
System.Windows;
System.Windows.Input;
System.Windows.Media;
System.Windows.Media.Media3D;

public partial class MainWindow : Window


{
public MainWindow()
{
InitializeComponent();
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
static TimeSpan lastRenderTime = new TimeSpan();
void CompositionTarget_Rendering(object sender, EventArgs e)
{
//
if (lastRenderTime == ((RenderingEventArgs)e).RenderingTime)
return;
lastRenderTime = ((RenderingEventArgs)e).RenderingTime;
GeneralTransform3DTo2D transform = Cube.TransformToAncestor(myGrid);
Point p = transform.Transform(new Point3D(-1, -1, -1));
t_000.X = p.X; t_000.Y = p.Y;
p = transform.Transform(new Point3D(-1, -1, 1));
t_001.X = p.X; t_001.Y = p.Y;
p = transform.Transform(new Point3D(-1, 1, -1));
t_010.X = p.X; t_010.Y = p.Y;
p = transform.Transform(new Point3D(-1, 1, 1));
t_011.X = p.X; t_011.Y = p.Y;
p = transform.Transform(new Point3D(1, -1, -1));
t_100.X = p.X; t_100.Y = p.Y;
p = transform.Transform(new Point3D(1, -1, 1));
t_101.X = p.X; t_101.Y = p.Y;
p = transform.Transform(new Point3D(1, 1, -1));
t_110.X = p.X; t_110.Y = p.Y;
p = transform.Transform(new Point3D(1, 1, 1));
t_111.X = p.X; t_111.Y = p.Y;
}
}

674

16.

GeneralTransform3DTo2D,
Grid.

.
,
. ,
CompositionTarget.Rendering.
Visual3D
TransformToDescendant Trans
formToAncestor: GeneralTransform3D,
Visu
al3D .

, , , API WPF
API. .16.1
, 3D- ,
. WPF
,
.
3D-, WPF,
, ,
. 3D- WPF
.
, . 3D-
(DataTemplate)
(ControlTemplate). ,
.
API, ,
. 19
D3DImage, Direct3D.
, 3D
.
, ,
.


XAML-



17
17.

WPF
. ,
!
, ,
, . ,
Adobe Flash,
,

. iPhone, iPad, Windows-
, Xbox Windows 7 ( )
. , ,
.
, Microsoft Expres
sion Blend, WPF ,
Adobe Flash. , WPF API
,
.
, ,
C# XAML.
WPF
. ,
XAML,
. ,
/
. ,
(VSM).

676

17.


, ,
,
. WPF :
. - ,
, ,
Width, .
,
,
, WPF.
.
WPF, .



,
.
(
) ,
.
/ .
,
WPF. WPF DispatcherTimer,
.
Interval, Tick.
Windows-
, .
,
WPF.
,
,
Rendering System.Windows.Media.CompositionTarget.
,
. ( ,
enterFrame Adobe Flash,
.)
Rendering
,
, ,
, , .
,
.

677


. Rendering
(
),
. WPF ,
-
. Rendering ,
. Rendering
.


DispatcherTimer .NET
DispatcherTimer ,
System.Threading.Timer System.Timers.Timer, ,
DispatcherTimer
. WPF- ,
UIElement ,
.

Dispatcher. :
void Callback(object sender, EventArgs e)
{
// DoTheRealWork :
this.Dispatcher.Invoke(DispatcherPriority.Normal,
new TimerDispatcherDelegate(DoTheRealWork));
}

Dispatcher.Invoke .
, Dispatcher.BeginInvoke.
DispatcherTimer :
void Callback(object sender, EventArgs e)
{
//
}

DispatcherTimer
DispatcherPriority, Background, Dispat
cherTimer DispatcherPriority.


CompositionTarget.Rendering
, WPF
.
System.Windows.Media.Animation ,

678

17.

.
, ,
.
:
.
WPF ,
,
DispatcherTimer Rendering.
,
. WPF
,
WPF
; ! WPF
,
.
System.Windows.Media.Animation
,
. ,
, double,
DoubleAnimation.
Thickness, ThicknessAnimation. WPF
22 ; .17.1.
17.1. ,

.NET

WPF

Boolean

Thickness

Byte

Color

Char

Size

Decimal

Rect

Int16

Point

Int32

Point3D

Int64

Vector

Single

Vector3D

Double

Rotation3D

String

Matrix

Object

Quaternion

679



System.Windows.Media.Animation :
22 XXXAnimationBase
17 XXXAnimation
22 XXXAnimationUsingKeyFrames
22 XXXKeyFrameCollection
22 XXXKeyFrame
22 DiscreteXXXKeyFrame
17 LinearXXXKeyFrame
17 SplineXXXKeyFrame
17 EasingXXXKeyFrame
3 XXXAnimationUsingPath
( XXX .17.1.)
, 10
181 ! , .NET,
, :
WPF ?
, Animation<T>,
double Animation<double>,
Thickness Animation<Thickness> ..?
( ) ,
XAML2009
XAML . ,
, ,
. , Animation<T> ,
,
Animation<Window>.
, , .


, , double.
double ,
,
double.
, Width Button 50 100.

Canvas:
<Window x:Class="Window1" Title="Animation" Width="300" Height="300"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

680

17.

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas>
<Button x:Name="b">OK</Button>
</Canvas>
</Window>

Width 50 100
DoubleAnimation:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
//
DoubleAnimation a = new DoubleAnimation();
a.From = 50;
a.To = 100;
//
b.BeginAnimation(Button.WidthProperty, a);
}
}

DoubleAnimation
double double. BeginAnima
tion Button,
Width . ,
, 50 100
.
From To ,
.
.
, Completed, ,
.


, double
. (
!)
, Width 55
0,1 (5% , ), 75
0,5 (50% ) ..

681

,
, ,
.
.17.1 . ( , Boolean
String, .)
,
, . .
,
Visibility,
Hidden Visible .
Opacity double, 0 1.
, , Grid,
,
Grid.Column Int32Animation,
.
TranslateTransform RenderTrans
form, X ( double)
DoubleAnimation.
Width Grid (
: , ,
, Visual Studio 5
) , ColumnDefi
nition.Width GridLength,
. MinWidth
/ MaxWidth ColumnDefinition, double,
Width Auto,
, Width .



BeginAnimation. BeginAnimation

. ,
, Height
Window Width :
this.BeginAnimation(Window.HeightProperty, a);

.17.1. (
, ,
,
,
Expander.
.)

682

17.

(Value = 50)

(Value = 75)

(Value = 100)

.17.1. DoubleAnimation
50 100


Doub
leAnimation 1 ,
Duration:
DoubleAnimation a = new DoubleAnimation();
a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

, Duration TimeSpan !
TimeSpan.Parse, Duration
XAML, ,
.::._
. . "2"
2 , 2 ! "2.5" 2 5 ! "0:2"
2 . , , ,
, ::
::._. , 2
"0:0:2", "0:0:0.5" "0:0:.5".

683

.17.1 5 . Dura
tion TimeSpan, .NET
Framework .
TimeSpan.Parse
.::._.


Duration TimeSpan
, WPF Duration
TimeSpan, , Duration ,
TimeSpan: Duration.Automatic Duration.
Forever.
, Storyboard (. ).
Automatic Duration
, TimeSpan 1 .
Forever , DoubleAnimation,

. WPF
!

From To
.17.1 Width
Height 50 100, 50
. ,
. BeginAnimation
, .
, To Width/Height
50,
ActualWidth Button 100,
ActualHeight Window 100. , .
From . ,
, .
, ,
:
DoubleAnimation a = new DoubleAnimation();
// : a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

, , Width
(, "OK",
) 100 5 .
AnimationException :

684

17.

'System.Windows.Media.Animation.DoubleAnimation' cannot use default


origin value of 'NaN'.

Width ,
NaN. NaN 100!
, ActualWidth (
, NaN) Width ,
.
, -
Width . :
<!--
From: -->
<Button x:Name="b" Width="20">OK</Button>

Window .17.1 From,


, Height
300. ,
20 100, 300 100!
, Width 100,
100.

From ,
.
, 50 100
,
50. From ,
,
, . ,
MouseEnter MouseLeave,
, From ,
,
.

To !
, 50 20
( ) 5 :
DoubleAnimation a = new DoubleAnimation();
a.From = 50;
// : a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

By,
To. 100 ( 150),
100:

685

DoubleAnimation a = new DoubleAnimation();


a.From = 50;
a.By = 100; // a.To = 50 + 100;

By From :
100 .
DoubleAnimation a = new DoubleAnimation();
a.By = 100; // a.To = currentValue + 100;


:
DoubleAnimation a = new DoubleAnimation();
a.By = -100; // a.To = currentValue - 100;


: From, To,
Duration, By. ,
.
By, -
, ,
. ,
XAML.

BeginTime
,
BeginAnimation, ,
BeginTime TimeSpan:
DoubleAnimation a = new DoubleAnimation();
// 5 :
a.BeginTime = TimeSpan.Parse("0:0:5");
a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

,
. BeginTime
:
DoubleAnimation a = new DoubleAnimation();
// :
a.BeginTime = TimeSpan.Parse("-0:0:2.5");
a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

, 2,5
( 2,5

686

17.

). , From 75, To 100,


Duration 2,5 .
, BeginTime Nullable<TimeSpan>, Duration,
Duration
. ( BeginTime Forever?!)

TimeSpan.Parse,
, TimeSpan (, , ,
XAML).
TimeSpan, FromSeconds
FromMilliseconds.

SpeedRatio
SpeedRatio , Duration.
1, double,
0:
DoubleAnimation a = new DoubleAnimation();
a.BeginTime = TimeSpan.Parse("0:0:5");
// :
a.SpeedRatio = 2;
a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

, 1, , 1
. SpeedRatio BeginTime;
5- , 50 100
2,5 5.

AutoReverse
AutoReverse true,
.
, . ,
50 100 5 100 50 5 :
DoubleAnimation a = new DoubleAnimation();
a.AutoReverse = true;
a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

SpeedRatio .
SpeedRatio = 2,
5 , SpeedRatio = 0.5, 20 .

687

, , BeginTime,
;
.

RepeatBehavior
RepeatBehavior :


,


RepeatBehavior double:
DoubleAnimation a = new DoubleAnimation();
// :
a.RepeatBehavior = new RepeatBehavior(2);
a.AutoReverse = true;
a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

AutoReverse true, .
20
: 50 100 50 100 50. BeginTime ,
. double,
.

, Repeat
Behavior RepeatBehavior.Forever:
a.RepeatBehavior = RepeatBehavior.Forever;

,
RepeatBehavior TimeSpan, double.
:
DoubleAnimation a = new DoubleAnimation();
// :
a.RepeatBehavior = new RepeatBehavior(TimeSpan.Parse("0:0:20"));
a.AutoReverse = true;
a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));

20 ,
AutoReverse true. , SpeedRatio

688

17.

TimeSpan, RepeatBehavior,
; SpeedRatio = 2,
20 .
RepeatBehavior
, ,
TimeSpan , .
50 75 2,5 :
DoubleAnimation a = new DoubleAnimation();
// :
a.RepeatBehavior = new RepeatBehavior(TimeSpan.Parse("0:0:2.5"));
a.From = 50;
a.To = 100;
a.Duration = new Duration(TimeSpan.Parse("0:0:5"));



,
BeginTime, SpeedRatio, AutoReverse RepeatBehavior,
, .
Duration !

:
= BeginTime +

Duration * (AutoReverse ? 2 : 1)
* RepeatBehavior
SpeedRatio

, RepeatBehavior
double (
1). RepeatBehavior TimeSpan,

RepeatBehavior BeginTime.

AccelerationRatio, DecelerationRatio EasingFunction


.
25% , , , 25%
. AccelerationRatio DecelerationRatio
.
, ,
.
double 0 1
( 0). AccelerationRatio
,
. DecelerationRatio

689

,
.
, (100%).
. 17.2 , AccelerationRatio
DecelerationRatio .
AccelerationRatio = 1

AccelerationRatio = 0.33

AccelerationRatio = 0.33, DecelerationRatio = 0.33

.17.2. AccelerationRatio DecelerationRatio


WPF4 EasingFunction,
, IEas
ingFunction.
. WPF 11 , IEas
ingFunction, (
, ).
. .

IsAdditive IsCumulative
IsAdditive true, (
) From To
.
RepeatBehavior, ,
. , ,
, , ,
.

690

17.

IsCumulative IsAdditive, RepeatBeha


vior ( RepeatBehavior). , RepeatBehavior
50 100, 50 100,
50, 100, 50
100. IsCumulative true,
50 200.
AutoReverse true,
, : 50 100 50
100 150 100 150 200 150.

FillBehavior
, ,
, , -
. , , ,
,
FillBehavior Stop (
HoldEnd).

XAML-
,
XAML-. :
<DoubleAnimation From="50" To="100" Duration="0:0:5" AutoReverse="True"/>

?
,
BeginAnimation.
,
, .
, , WPF
XAML. ,
, Setter, .
,
,
.
.


3 WPF , (
EventTrigger)
. Ro
utedEvent, (
, TriggerAction) Actions.
, DoubleAnimation, ,
Actions .

XAML-

691

Storyboard (
), BeginStoryboard.
, DoubleAnima
tion , ,
:
<Button>
OK
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard TargetProperty="Width">
<DoubleAnimation From="50" To="100"
Duration="0:0:5" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>

, BeginAnimation
: Storyboard TargetProperty
, , BeginSto
ryboard , Storyboard .
, BeginStoryboard , WPF
, TriggerAction.
,
BeginStoryboard
, , .. ( PauseStoryboard,
SeekStoryboard ..)

XAML , Storyboard.


XAML- TargetProperty Story
board (Width) .
TargetProperty PropertyPath, ,
( ),
.
Button, Background
- LinearGradientBrush

692

17.

GradientStop. ColorAnimation,
Color . (
, Color
,
ScA, ScR, ScB ScG, ColorAnimation
, DoubleAnimation .)
- Storyboard
TargetProperty:
<Button Padding="30">
OK
<Button.Background>
<LinearGradientBrush>
<GradientStop Color="Blue" Offset="0"/>
<GradientStop Color="Black" Offset="0.5"/>
<GradientStop Color="Blue" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard TargetProperty="Background.GradientStops[1].Color">
<ColorAnimation From="Black" To="White" Duration="0:0:2"
AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>

TargetProperty , C#
, .
, Background
, GradientStops, ,

Color Color.
, . ,
, ,
.17.3.

.17.3. -

XAML-

693

DoubleAnimation Background.
GradientStops[1].Offset ,
.
Color Offset Loaded,
BeginStoryboard:
<EventTrigger RoutedEvent="Button.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard TargetProperty="Background.GradientStops[1].Color">
<ColorAnimation From="Black" To="White" Duration="0:0:2"
AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
<BeginStoryboard>
<Storyboard TargetProperty="Background.GradientStops[1].Offset">
<DoubleAnimation From="0" To="1" Duration="0:0:2"
AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>

, WPF
Storyboard. -, Storyboard
. Storyboard
Children, Timeline (
). -, TargetProperty ,
,
Storyboard! XAML-
:
<EventTrigger RoutedEvent="Button.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation From="Black" To="White" Duration="0:0:2"
Storyboard.TargetProperty="Background.GradientStops[1].Color"
AutoReverse="True" RepeatBehavior="Forever"/>
<DoubleAnimation From="0" To="1" Duration="0:0:2"
Storyboard.TargetProperty="Background.GradientStops[1].Offset"
AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>

,
.
, , , ,
BeginTime.

694

17.


,
, . ,
, Style -.
, TargetName Sto
ryboard. TargetProperty, TargetName
Storyboard,
.
TargetName

, :
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<BeginStoryboard>
<Storyboard TargetName="jim2" TargetProperty="Opacity">
<DoubleAnimation From="1" To="0" Duration="0:0:4"
AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
<Image Name="jim1" Source="jim1.gif"/>
<Image Name="jim2" Source="jim2.gif"/>
</Grid>


,
. .17.4.

Opacity = 1

Opacity = 0.5

Opacity = 0

.17.4. Opacity Image


XAML-

695

TargetName ,
jim2,
Grid. (, -
Image)
, , Storyboard.
, TargetName
.


XAML-
.
Style. 17.1 StackPanel
.
MouseEnter MouseLeave,
.
.17.5.
17.1.
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Animation">
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="VerticalAlignment" Value="Bottom"/>
<Setter Property="LayoutTransform">
<Setter.Value>
<ScaleTransform/>
</Setter.Value>
</Setter>
<Style.Triggers>
<EventTrigger RoutedEvent="Button.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleX"
To="2" Duration="0:0:0.25"/>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY"
To="2" Duration="0:0:0.25"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleX"
To="1" Duration="0:0:0.25"/>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY"
To="1" Duration="0:0:0.25"/>

696

17.

</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel Orientation="Horizontal">
<Button>1</Button>
<Button>2</Button>
<Button>3</Button>
<Button>4</Button>
<Button>5</Button>
<Button>6</Button>
<Button>7</Button>
<Button>8</Button>
</StackPanel>
</Window>

.17.5.

TargetProperty
ScaleX ScaleY .
, LayoutTransform
ScaleTransform. LayoutTransform
TransformGroup, ScaleTransform
,
LayoutTransform.Children[0].ScaleX LayoutTransform.Child
ren[0].ScaleY.


ScaleTransform / TranslateTransform
. ScaleX ScaleY ScaleTransform
, Width Height,
, .
TranslateTransform , - Can
vas.Left Canvas.Top, ,
.

XAML-

697

RepeatBehavior, Duration, ,
XAML.
, TimeSpan. RepeatBehavior.
Forever "Forever", , "x" (
, "2x" "3x"), .

ScaleTransform,
ScaleTransform, 17.1
LayoutTransform ScaleTransform Style. (
, , -
LayoutTransform .) From ,
. Duration
, TimeSpan.
Parse ( "Automatic" "Forever").



Style.Triggers 17.1 ,
IsMouseOver:
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleX"
To="2" Duration="0:0:0.25"/>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY"
To="2" Duration="0:0:0.25"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleX"
To="1" Duration="0:0:0.25"/>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY"
To="1" Duration="0:0:0.25"/>
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
</Style.Triggers>

698

17.

Actions
: EnterActions ExitActions. , EnterActions,
, ( ,
Setter), ExitActions
( , Setter, ).

, . .


Storyboard ,
, . Story
board Timeline, ,
(DoubleAnimation, ColorAnimation ..). , Storyboard
, : Duration, BeginTime,
SpeedRatio, AutoReverse, RepeatBehavior, AccelerationRatio, DecelerationRatio, Fill
Behavior .
17.2 ,
TextBlock,
. Storyboard RepeatBehavior,
. .17.6
:
17.2. ,
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Background="Black" TextBlock.Foreground="White" TextBlock.FontSize="30">
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<BeginStoryboard>
<Storyboard TargetProperty="Opacity" RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="title1" BeginTime="0:0:2"
From="0" To="1" Duration="0:0:2" AutoReverse="True"/>
<DoubleAnimation Storyboard.TargetName="title2" BeginTime="0:0:6"
From="0" To="1" Duration="0:0:2" AutoReverse="True"/>
<DoubleAnimation Storyboard.TargetName="title3" BeginTime="0:0:10"
From="0" To="1" Duration="0:0:2" AutoReverse="True"/>
<DoubleAnimation Storyboard.TargetName="title4" BeginTime="0:0:14"
From="0" To="1" Duration="0:0:2" AutoReverse="True"/>
<DoubleAnimation Storyboard.TargetName="title5" BeginTime="0:0:18"
From="0" To="1" Duration="0:0:2" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Opacity="0"
Name="title1">In a world</TextBlock>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Opacity="0"

699

Name="title2">where user interfaces need to be created</TextBlock>


<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Opacity="0"
Name="title3">one book</TextBlock>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Opacity="0"
Name="title4">will explain it all...</TextBlock>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Opacity="0"
Name="title5">WPF 4 Unleashed</TextBlock>
</Grid>

.17.6.

, Timeline,
, ,
. ,
17.2 RepeatBehavior="Forever"
, Storyboard , .
, ,
, title1 title2.
, title1, title2 title3, ..
, DoubleAnimation SpeedRatio="2",

, 18
. , SpeedRatio="2"
, Begin
Time, . , 9
. AccelerationRatio="1"
, (
) . Duration ,
,
.



(
AccelerationRatio Decele
rationRatio), .
, ,

.
. , DoubleAnimation DoubleAnimation
UsingKeyFrames; XXXAnimation.

700

17.


, , From, To By.
KeyFrames,
, . WPF
, .


17.3 DoubleAnimationUsingKeyFrames ,
(.17.7).
Image Canvas,
Canvas.Left Canvas.Top,
TranslateTransform.
17.3. , .17.7
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Animation Using Keyframes" Height="300" Width="580">
<Canvas>
<Image Source="fly.png">
<Image.Triggers>
<EventTrigger RoutedEvent="Image.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)"
From="0" To="500" Duration="0:0:3"/>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Top)"
Duration="0:0:3">
<LinearDoubleKeyFrame Value="0" KeyTime="0:0:0"/>
<LinearDoubleKeyFrame Value="200" KeyTime="0:0:1"/>
<LinearDoubleKeyFrame Value="0" KeyTime="0:0:2"/>
<LinearDoubleKeyFrame Value="200" KeyTime="0:0:3"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Image.Triggers>
</Image>
</Canvas>
</Window>

,
. DoubleAnimation,
0 500.
,
0 200 .

701

.17.7.



, 17.3
Canvas.Left Canvas.Top .
To
Window Canvas. :
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="0"
To="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Canvas}}, Path=ActualWidth}"
Duration="0:0:3"/>

, Image.
Loaded, ,
ActualHeight Window Canvas. (
ActualHeight NaN, AnimationException.)
, ,
.

TargetProperty,
!
, 17.3 , Canvas.Left
Canvas.Top TargetProperty Sto
ryboard, .
, .
, Canvas Image (,
, Left Top) ,
.

702

17.

(LinearDoubleKeyFrame) 17.3
,
. , KeyTime . ,
WPF ,
. KeyTime
,
. ( , KeyTime
KeyTimeType.Uniform "Uniform" XAML.)
17.3
0, 1, 2 3 , WPF
.
LinearDoubleKeyFrame,
. ,
0,5, 1,5 2,5 100.
DoubleAnimationUsingKeyFrames KeyFrames
DoubleKeyFrame,
, . Linear
DoubleKeyFrame DoubleKeyFrame : SplineDouble
KeyFrame, DiscreteDoubleKeyFrame EasingDoubleKeyFrame.

KeyTime , TimeSpan.
,
. , DoubleAnimation
UsingKeyFrame 17.3
:
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Top)"
Duration="0:0:3">
<LinearDoubleKeyFrame Value="0" KeyTime="0%"/>
<LinearDoubleKeyFrame Value="200" KeyTime="33.3%"/>
<LinearDoubleKeyFrame Value="0" KeyTime="66.6%"/>
<LinearDoubleKeyFrame Value="200" KeyTime="100%"/>
</DoubleAnimationUsingKeyFrames>

KeyTime Paced,
, .
, , 0
200, , ,
0 100.


LinearXXXKeyFrame SplineXXXKeyFrame.
, ,
17.3 , :

703

<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Top)"
Duration="0:0:3">
<SplineDoubleKeyFrame Value="0" KeyTime="0:0:0"/>
<SplineDoubleKeyFrame Value="200" KeyTime="0:0:1"/>
<SplineDoubleKeyFrame Value="0" KeyTime="0:0:2"/>
<SplineDoubleKeyFrame Value="200" KeyTime="0:0:3"/>
</DoubleAnimationUsingKeyFrames>

Key
Spline, . KeySpline
KeySpline,
. KeySpline Point,
. (
0, 1.) Key
Spline XAML . ,
(. .17.7)
(.17.8):
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Top)"
Duration="0:0:3">
<SplineDoubleKeyFrame KeySpline="0,1 1,0" Value="0" KeyTime="0:0:0"/>
<SplineDoubleKeyFrame KeySpline="0,1 1,0" Value="200" KeyTime="0:0:1"/>
<SplineDoubleKeyFrame KeySpline="0,1 1,0" Value="0" KeyTime="0:0:2"/>
<SplineDoubleKeyFrame KeySpline="0,1 1,0" Value="200" KeyTime="0:0:3"/>
</DoubleAnimationUsingKeyFrames>

.17.8. ,

KeySpline, ,
-
, Expression Blend.
,
.


, ,
,

704

17.

. DoubleAnimationUsingKeyFrame 17.3
, .17.9:
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Top)"
Duration="0:0:3">
<DiscreteDoubleKeyFrame Value="0" KeyTime="0:0:0"/>
<DiscreteDoubleKeyFrame Value="200" KeyTime="0:0:1"/>
<DiscreteDoubleKeyFrame Value="0" KeyTime="0:0:2"/>
<DiscreteDoubleKeyFrame Value="200" KeyTime="0:0:3"/>
</DoubleAnimationUsingKeyFrames>

.17.9.

,
. ,
.17.10:
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Top)"
Duration="0:0:3">
<DiscreteDoubleKeyFrame Value="0" KeyTime="0:0:0"/>
<LinearDoubleKeyFrame Value="200" KeyTime="0:0:1"/>
<DiscreteDoubleKeyFrame Value="0" KeyTime="0:0:2"/>
<SplineDoubleKeyFrame KeySpline="0,1,1,0" Value="200" KeyTime="0:0:3"/>
</DoubleAnimationUsingKeyFrames>

.17.10.

705

,
, ,
.
SplineXXXKeyFrame, LinearXXXKeyFrame
DiscreteXXXKeyFrame. WPF
, ,
. Boolean, Char,
Matrix, Object String. WPF
,
( , Boolean).
, ,
TextBlock
(
Uniform KeyTime):
<StringAnimationUsingKeyFrames Storyboard.TargetProperty="Text" Duration="0:0:.5">
<DiscreteStringKeyFrame Value="play"/>
<DiscreteStringKeyFrame Value="Play"/>
<DiscreteStringKeyFrame Value="PLay"/>
<DiscreteStringKeyFrame Value="PLAy"/>
<DiscreteStringKeyFrame Value="PLAY"/>
</StringAnimationUsingKeyFrames>

,
,
Setter. ,

0 Opacity ,
, :
<Button>
Click Me Once
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity">
<DiscreteDoubleKeyFrame Value="0" KeyTime="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>

706

17.


WPF4 LinearXXXKeyFrame (SplineXXXKeyFrame)
EasingXXXKeyFrame.
EasingFunction, ,
IEasingFunction. EasingFunction
, .
, .



WPF Double, Point Matrix.
DoubleAnimationUsingPath, PointAnimationUsingPath MatrixAnimationUsing
Path PathGeometry,
(
).
,
, PathGeometry ,
. ( DoubleAnimationUsingPath .
PathGeometry X
, Y .)


WPF 11 ,
IEasingFunction,
. Easing
Mode: EaseIn ( ), EaseOut EaseInOut.
QuadraticEase DoubleAnima
tion:
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" From="200" To="0"
Duration="0:0:3">
<DoubleAnimation.EasingFunction>
<QuadraticEase/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>

EasingMode , EaseIn:
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" From="200" To="0"
Duration="0:0:3">
<DoubleAnimation.EasingFunction>
<QuadraticEase EasingMode="EaseOut"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>

707

EaseOut , EaseIn,
EaseInOut EaseIn EaseOut
.


. 17.2
: , ,
,
.
17.2.
EaseIn

EaseOut

EaseInOut

QuadraticEase
( = 2)

CubicEase
( = 3)

QuarticEase
( = 4)

QuinticEase
( = 5)

PowerEase
( = 10)

708

17.

50% (0,5) 50% (0,5).


25% (0,5 0,5 = 0,25)
50% .
12,5% (0,5 0,5 0,5 = 0,125) 50% ..
WPF 2 5,
PowerEase,
Power. Power 2 (
), .17.2
, Power 10, , Power
. PowerEase Power, 10,
:
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" From="200" To="0"
Duration="0:0:3">
<DoubleAnimation.EasingFunction>
<PowerEase Power="10"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>


.17.3
.
(
) :
BackEase (
), . BackEase
Amplitude ( 1), ,
.
BounceEase ( ,
). BounceEase ,
. Bounces ( 3) ,
, Bounciness (
2)
. EaseIn Bounciness=2
. EaseOut
Bounciness=2 .
CircleEase ( EaseIn) ( EaseOut)
(t) = 1 1 t 2 .
ElasticEase .
BounceEase, .
Oscillations ( 3) ,
, Springiness (
3) . Springiness
: ,
( ),

709

, ( ,
, ).
ExponentialEase
, Exponent (
2).
SineEase .
17.3.
EaseIn

BackEase

BounceEase

CircleEase

ElasticEase

ExponentialEase

SineEase

EaseOut

EaseInOut

710

17.

BackEase ElasticEase
!
BackEase ElasticEase
, From To, ,
( EaseIn EaseInOut)
( EaseOut EaseInOut),
. ,
, Width Height ,
.


,
IEasingFunction. IEasingFunction
Ease:
public double Ease(double normalizedTime)
{
// , 0 1
...
}

Ease
0 1.
, 0 1, . (
, Back
Ease ElasticEase.)
,
( ):
public class LinearEase : IEasingFunction
{
public double Ease(double normalizedTime)
{
return normalizedTime; //
}
}

,
QuadraticEase:
public class SimpleQuadraticEase : IEasingFunction
{
public double Ease(double normalizedTime)
{
// EaseIn:

711

return normalizedTime * normalizedTime; //


}
}

SimpleQuadraticEase QuadraticEase,
EasingMode. , WPF
EasingFunctionBase ( 11
), EasingMode .
EasingFunctionBase EasingMode
IEasingFunction. Ease
EaseInCore,
, Ease (
EaseIn).
EasingMode EasingFunctionBase normalizedTime
EaseInCore, .
, EaseIn,
.
,
EasingMode
Ease EaseInCore:
public class CompleteQuadraticEase : EasingFunctionBase
{
protected override double EaseInCore(double normalizedTime)
{
return normalizedTime * normalizedTime; //
}
// EasingFunctionBase:
protected override Freezable CreateInstanceCore()
{
return new CompleteQuadraticEase();
}
}

CreateInstance
Core, Freezable, Eas
ingFunctionBase. CompleteQuadraticEase ,
QuadraticEase.
, SexticEase (
QuinticEase):
public class SexticEase : EasingFunctionBase
{
protected override double EaseInCore(double normalizedTime)
{
return normalizedTime * normalizedTime * normalizedTime
* normalizedTime * normalizedTime * normalizedTime;
}

712

17.

// EasingFunctionBase:
protected override Freezable CreateInstanceCore()
{
return new SexticEase();
}
}


EaseOut and EaseInOut
EaseIn , ,
EaseInCore, ,
. EaseOut
EaseInOut, , Easing
FunctionBase.Ease EaseInCore.
EaseIn EaseInCore 0
1. EaseOut EaseInCore 1 0
( EaseInCore normalizedTime 1-normalizedTime).
value, EaseInCore, :
c 1-value.
EaseInOut (normalizedTime 0 0.5
) (normalizedTime 0.5 1)
. normalizedTime, EaseIn
Core, ( 0 1
), .
normalizedTime, EaseInCore,
( 1 0 ).
, , 0.5 (
).
EaseInOut
.


(.
14 , , ),
VisualState. VisualState,
, Storyboard,
,
.
, , ,
. 17.4
Button 14.8,
VisualState (
, ).

713

17.4. Button
<Style TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Background" Value="Black"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid RenderTransformOrigin=".5,.5">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualState Name="Normal"/>
<VisualState Name="MouseOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="outerCircle"
Storyboard.TargetProperty=
"(Ellipse.Fill).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"
To="Orange" Duration="0:0:.4"/>
</Storyboard>
</VisualState>
<VisualState Name="Pressed">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="scaleTransform"
Storyboard.TargetProperty="ScaleX" To=".9"
Duration="0"/>
<DoubleAnimation Storyboard.TargetName="scaleTransform"
Storyboard.TargetProperty="ScaleY" To=".9"
Duration="0"/>
</Storyboard>
</VisualState>
<VisualState Name="Disabled">
<Storyboard>
<ColorAnimation Storyboard.TargetName="outerCircle"
Storyboard.TargetProperty=
"(Ellipse.Fill).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"
To="Gray" Duration="0:0:.4"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup Name="FocusStates">
<VisualState Name="Unfocused"/>
<VisualState Name="Focused">
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty=
"(Grid.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)"
To="-20" AutoReverse="True"
RepeatBehavior="Forever" Duration="0:0:.4">
<DoubleAnimation.EasingFunction>
<QuadraticEase/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>

714

17.

</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="scaleTransform"/>
<TranslateTransform x:Name="translateTransform"/>
</TransformGroup>
</Grid.RenderTransform>
<Ellipse x:Name="outerCircle">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0"
Color="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Background.Color}"/>
<GradientStop x:Name="highlightGradientStop" Offset="1" Color="Red"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse RenderTransformOrigin=".5,.5">
<Ellipse.RenderTransform>
<ScaleTransform ScaleX=".8" ScaleY=".8"/>
</Ellipse.RenderTransform>
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Viewbox>
<ContentPresenter Margin="{TemplateBinding Padding}"/>
</Viewbox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

.17.11 ,
.
Normal CommonStates ;
. MouseOver
, Pressed
90%, Disabled
(Gray). FocusStates
Unfocused , Focused
QuadraticEase,
, . (
Quadra
ticEase , BounceEase!)

715

FocusVisualStyle null,
,
.

Normal, Unfocused

MouseOver, Unfocused

Disabled, Unfocused

Normal, Focused

Pressed, Focused

.17.11.
17.4 (. )

Focused Disabled 14 ,
MouseOver Pressed IsMouseOver Is
Pressed .
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outerCircle" Property="Fill" Value="Orange"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX=".9" ScaleY=".9"/>
</Setter.Value>
</Setter>
<Setter Property="RenderTransformOrigin" Value=".5,.5"/>
</Trigger>
</ControlTemplate.Triggers>

, RenderTransform
RenderTransformOrigin,

716

17.

. Pressed
ScaleX ScaleY Scale
Transform.

, 17.4, .
,
Normal Unfocused.
, ,
.
, Storyboard
, ,
,
.
, VisualStateGroup
. - Transitions;
VisualTransition,

. VisualTransition
To From,
. ,
; To,
..
Visual
Transition, .
:
1. VisualTransition To From.
2. VisualTransition To From.
3. VisualTransition From To.
4. VisualTransition, , To From .
Transitions VisualStateGroup ,

.
VisualTransition,
GeneratedDuration,
. GeneratedEasingFunction,
.
Storyboard ,
.
17.5 VisualStateGroup
VisualTransition,
Normal Unfocused.

717


, VisualState
Duration, 0,
Setter, ,
( )
VisualTransitions VisualStateGroup.
, Focused
17.4 17.5.

17.5. 17.4
VisualStateGroup,
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualStateGroup.Transitions>
<!-- ... -->
<VisualTransition GeneratedDuration="0:0:.4"/>
<!-- ... Pressed : -->
<VisualTransition To="Pressed" GeneratedDuration="0"/>
<VisualTransition From="Pressed" GeneratedDuration="0"/>
</VisualStateGroup.Transitions>
<VisualState Name="Normal"/>
<VisualState Name="MouseOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="outerCircle"
Storyboard.TargetProperty=
"(Ellipse.Fill).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"
To="Orange" Duration="0"/>
</Storyboard>
</VisualState>
<VisualState Name="Pressed">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="scaleTransform"
Storyboard.TargetProperty="ScaleX" To=".9"
Duration="0"/>
<DoubleAnimation Storyboard.TargetName="scaleTransform"
Storyboard.TargetProperty="ScaleY" To=".9"
Duration="0"/>
</Storyboard>
</VisualState>
<VisualState Name="Disabled">
<Storyboard>
<ColorAnimation Storyboard.TargetName="outerCircle"
Storyboard.TargetProperty=
"(Ellipse.Fill).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"
To="Gray" Duration="0"/>
</Storyboard>

718

17.

</VisualState>
</VisualStateGroup>
<VisualStateGroup Name="FocusStates">
<VisualStateGroup.Transitions>
<!-- : -->
<VisualTransition To="Unfocused" GeneratedDuration="0:0:.4">
<VisualTransition.GeneratedEasingFunction>
<QuadraticEase/>
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState Name="Unfocused"/>
<VisualState Name="Focused">
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty=
"(Grid.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)"
To="-20" AutoReverse="True"
RepeatBehavior="Forever" Duration="0:0:.4">
<DoubleAnimation.EasingFunction>
<QuadraticEase/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>

VisualTransition ,
!
, Storyboard.Target
Property 17.4 17.5:
<ColorAnimation Storyboard.TargetName="outerCircle"
Storyboard.TargetProperty=
"(Ellipse.Fill).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"
To="Orange" .../>
...
<ColorAnimation Storyboard.TargetName="outerCircle"
Storyboard.TargetProperty=
"(Ellipse.Fill).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"
To="Gray" .../>
...
<DoubleAnimation Storyboard.TargetProperty=
"(Grid.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)"
To="-20" AutoReverse="True"
RepeatBehavior="Forever" Duration="0:0:.4">
...
</DoubleAnimation>

719

GradientStop (
) TranslateTransform ( )
Storyboard.TargetName, :
<ColorAnimation Storyboard.TargetName="highlightGradientStop"
Storyboard.TargetProperty="Color"
To="Orange" .../>
...
<ColorAnimation Storyboard.TargetName="highlightGradientStop"
Storyboard.TargetProperty="Color"
To="Gray" .../>
...
<DoubleAnimation Storyboard.TargetName="translateTransform"
Storyboard.TargetProperty="Y"
To="-20" AutoReverse="True"
RepeatBehavior="Forever" Duration="0:0:.4">
...
</DoubleAnimation>

,
17.4 17.5,
VisualTransition. ,
, TargetName,
. :
VisualState VisualTransition, ,
,
. 17.5 . (
TranslateTransform Grid.)
, Pressed
ScaleTransform. ,
.
17.5,
Pressed . ,
Grid,
TargetProperty
"(Grid.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"

"(Grid.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"


, ,
- .
, :
"Fill.GradientStops[1].Color"
"RenderTransform.Children[1].Y"
"RenderTransform.Children[0].ScaleX"
"RenderTransform.Children[0].ScaleY"

720

17.

Transitions CommonStates VisualTransition


0,4 .
VisualTransition
Pressed ,
. VisualTransition
, Duration
, MouseOver Disabled, 0.
VisualTransition, FocusStates,
Unfocused,
Focused.
Focused, Visual
Transition QuadraticEase,
, .

:
(
) . Storyboard,
XAML,
.
WPF,


.
. , -
,
.
, WPF (
) ,
, .
RenderCapability System.Windows.
Media. Tier Tier
Changed. 0,
. 1
. 2 ( )
, . ,
0
( ).

: (
60 /) DesiredFrameRate
Storyboard. .

721

, (
, ),
RenderCapability.Tier . , ,
Tier 32- , .
, ,
16 :
int tier = RenderCapability.Tier >> 16

,
, !

18

18.

,
: ,
( ).
Windows Presentation Foundation
. (,
,
!)
, , , ,
!

WPF . , ,
,

. ,
Win32 Windows Media Player,
. , WPF
,
!
WPF, ,
.
:
SoundPlayer
SoundPlayerAction
MediaPlayer
MediaElement MediaTimeline

723

SoundPlayer
WPF-
, :
System.Media.SoundPlayer. SoundPlayer, .NET Framework
2.0, PlaySound API
Win32. , :
WAV.

( ).
.
,
.
, SoundPlayer:
SoundPlayer player = new SoundPlayer("tada.wav");
player.Play();

SoundPlayer URL . .NET Framework 3.5


URI pack ,
, Image.
, WPF (
Resource Content), .
Play , PlaySync
PlayLooping
,
Stop ( -
SoundPlayer
Win32 API).

.
, .
SoundPlayer Load LoadAsynch,
.
, ,
,
, System.Media SystemSounds,
Asterisk, Beep, Exclamation, Hand Question.
SystemSound,
Play ( ).
(
), ,
Windows!

724

18. ,

SoundPlayerAction
SoundPlayer
,
,
, SoundPlayer. WPF
SoundPlayerAction ( TriggerAction),
SoundPlayer .
XAML Button
EventTrigger,
:
<Button>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<SoundPlayerAction Source="click.wav"/>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseEnter">
<EventTrigger.Actions>
<SoundPlayerAction Source="hover.wav"/>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>

SoundPlayerAction SoundPlayer ,
,
.
, SoundPlayer . Sound
PlayerAction SoundPlayer ,
Source,
Play .
( ?), ,
.

MediaPlayer
SoundPlayer SoundPlayerAction
, WPF MediaPlayer
System.Windows.Media. Windows Media
Player, (WAV, WMA, MP3
).
( MediaPlayer)
Volume, 0 1 (
0.5).
MediaPlayer :

725

Pause (

CanPause true).
, true IsMuted.
,

Balance -1 1. -1 ,
, 0 ( )
, 1 .
, ,
( ),
SpeedRatio double.
1.0, , 1.0,
, 1.0 .
, Natural
Duration ( SpeedRatio),
Position.
, Position
.
MediaPlayer
:
MediaPlayer player = new MediaPlayer();
player.Open(new Uri("music.wma", UriKind.Relative));
player.Play();

,
. Open
, Play, Pause Stop. Close
, (
). ,
Close ,
!

MediaPlayer
, ,
WPF .

MediaElement MediaTimeline
MediaPlayer , SoundPlayer,
. (
,
, .) SoundPlayerAction

726

18. ,

SoundPlayer, ,
MediaElement MediaPlayer.
MediaElement FrameworkElement
System.Windows.Controls. ,
,
.. ( , , MediaElement
, .)
MediaElement ,
.
Source MediaElement URI- ,
, .

Source ,
MediaTimeline.
XAML,
SoundPlayerAction, ,
MediaElement MediaTimeline
.
<MediaElement x:Name="audio"/>
...
<Button>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<MediaTimeline Source="click.wma" Storyboard.TargetName="audio"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<MediaTimeline Source="hover.wma" Storyboard.TargetName="audio"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>

BeginStoryboard Storyboard
PauseStoryboard, ResumeStoryboard, SeekStoryboard
StopStoryboard , ,
.

727

, ,
RepeatBehavior MediaTimeline Forever
, Loaded
MediaElement. :
<MediaElement x:Name="audio">
<MediaElement.Triggers>
<EventTrigger RoutedEvent="MediaElement.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<MediaTimeline Source="music.mp3" Storyboard.TargetName="audio"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</MediaElement.Triggers>
</MediaElement>

,
. ( )
,
Source
( MediaElement ). , WPF

.

WPF MediaPlayer,
, MediaElement Media
Timeline. , , Windows Me
dia Player (WMV, AVI, MPG ), WPF-
.
MediaPlayer / MediaElement.

WPF Windows Media Player


10 !
Windows Media Player 10,
MediaPlayer ( )
. ,
Windows Vista.

728

18. ,

Windows Vista 32- Windows


Media Player!
64- Windows Windows Vista
32- Windows Media Player. (
) WPF Windows Media Player,
64-
. , 32-
. 32-
.NET Framework ( 64-).


MediaElement
Viewbox Image, MediaElement
Stretch StretchDirection, ,
. .18.1 Stretch
MediaElement, Window:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<MediaElement Source="C:\Users\Public\Videos\Sample Videos\butterfly.wmv"
Stretch="XXX"/>
</Window>

Uniform ( )

Fill

UniformToFill

.18.1. MediaElement Stretch

, MediaElement ,
, , FrameworkElement,
. ,

729

XAML-, .18.2,
, ,
180:
<Canvas>
<MediaElement Source="C:\Users\Public\Videos\Sample Videos\butterfly.wmv"
Opacity="0.5">
<MediaElement.Clip>
<EllipseGeometry Center="220,220" RadiusX="220" RadiusY="220"/>
</MediaElement.Clip>
<MediaElement.LayoutTransform>
<RotateTransform Angle="180"/>
</MediaElement.LayoutTransform>
</MediaElement>
<MediaElement Source="C:\Users\Public\Videos\Sample Videos\butterfly.wmv"
Opacity="0.5">
<MediaElement.Clip>
<EllipseGeometry Center="220,220" RadiusX="220" RadiusY="220"/>
</MediaElement.Clip>
</MediaElement>
</Canvas>

, MediaElement VisualBrush,
ListBox,
3D- ..
, .

.18.2. ,
MediaElement

730

18. ,

FAQ
?
-, Position .
Image, Media
Element RenderTargetBitmap ( Visual). :
MediaElement mediaElement = ...;
Size desiredSize = ...;
Size dpi = ...;
RenderTargetBitmap bitmap = new RenderTargetBitmap(desiredSize.Width,
desiredSize.Height, dpi.Width, dpi.Height, PixelFormats.Pbgra32);
bitmap.Render(mediaElement);
Image image = new Image();
image.Source = BitmapFrame.Create(bitmap);

MediaPlayer, MediaElement, Draw


ingVisual, Render RenderTargetBitmap:
DrawingVisual visual = new DrawingVisual();
MediaPlayer mediaPlayer = ...;
Size desiredSize = ...;
using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawVideo(mediaPlayer, new Rect(0, 0, desiredSize.Width,
desiredSize.Height));
}

DrawVideo DrawingContext,
MediaPlayer Rect.
, MediaElement , DrawVideo
OnRender!


XAML
Source MediaElement .
.
, ,
. ,
, ,
MediaTimeline. ,
PauseStoryboard ResumeStoryboard,
.
<Grid>
<Grid.Triggers>
<EventTrigger RoutedEvent="Button.Click" SourceName="playButton">

731

<EventTrigger.Actions>
<BeginStoryboard Name="beginStoryboard">
<Storyboard>
<MediaTimeline Source="C:\Users\Public\Videos\Sample Videos\butterfly.wmv"
Storyboard.TargetName="video"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Button.Click" SourceName="pauseButton">
<EventTrigger.Actions>
<PauseStoryboard BeginStoryboardName="beginStoryboard"/>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Button.Click" SourceName="resumeButton">
<EventTrigger.Actions>
<ResumeStoryboard BeginStoryboardName="beginStoryboard"/>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
<MediaElement x:Name="video"/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Bottom">
<Button x:Name="playButton" Background="#55FFFFFF" Height="40">Play</Button>
<Button x:Name="pauseButton" Background="#55FFFFFF" Height="40">Pause</Button>
<Button x:Name="resumeButton" Background="#55FFFFFF" Height="40">Resume
</Button>
</StackPanel>
</Grid>

Button,
(.18.3).

.18.3. ,

,
Source MediaElement,

732

18. ,

,
LoadedBehavior UnloadedBehavior, MediaState. Media
State : Play (
LoadedBehavior), Pause, Stop, Close (
UnloadedBehavior) Manual.

MediaTimeline
Storyboard,
. ,
,
. Storyboard
, -
.
, SlipBehavior
Storyboard Slip Grow.

.

,
MediaElement MediaPlayer,
(Play, Stop ..), ,
LoadedBehavior, UnloadedBehavior Manual. , Position
SpeedRatio ,
(Manual).
, , ,
MediaElement, MediaTimeline.
MediaElement ,
( Clock MediaClock)

.

,
Source URL- . ,
Windows Media Player, ASF- WMV-.
, - ( URL), . 19 .

733

!
URI-, Source Media
Player, MediaElement MediaTimeline, , URI,
WPF. ,
Windows Media Player,
URL-. ,
, .
,
,
SoundPlayer/SoundPlayerAction!
,
pack://siteOfOrigin.
URL
ApplicationDeployment.CurrentDeployment.ActivationUri ( Sys
tem.Deployment.Application, System.Deployment.dll),
URI.

MediaPlayer MediaElement
MediaFailed,
. :
<MediaElement Source="nonExistentFile.wmv" MediaFailed="OnMediaFailed"/>

OnMediaFailed :
void OnMediaFailed(object o, ExceptionRoutedEventArgs e)
{
MessageBox.Show(e.ErrorException.ToString());
}

, Source, ,
:
System.IO.FileNotFoundException: Cannot find the media file. --->
System.Runtime.InteropServices.COMException (0xC00D1197):
Exception from HRESULT: 0xC00D1197

, ,
- . , -

, .

734

18. ,

FAQ
,
?
WPF .
API Windows Media Player.

API, System.Speech,
, .
Microsoft SAPI,
W3C ,
.
System.Speech WPF,
WPF;
, ,
.
.NET WPF, Windows Forms .


( )
. .
Windows
Microsoft Anna. Microsoft SAPI SDK (
http://microsoft.com/speech) Microsoft
Anna, , Microsoft Sam,
;
Windows.


System.
Speech.dll. System.
Speech.Synthesis. :
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
synthesizer.Speak("I love WPF!");

,
, .
SpeakAsync
Speak:
synthesizer.SpeakAsync("I love WPF!");

735


Rate Volume SpeechSynthesizer. ,
Rate -10 10, Volume 0 100.
, SpeakAsyncCancelAll.
,
, SelectVoice:
synthesizer.SelectVoice("Microsoft Sam");

GetInstalledVoices.
,
(, -
):
synthesizer.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult);

WAV-, ,
SetOutputToWaveFile:
synthesizer.SetOutputToWaveFile("c:\Users\Adam\Documents\speech.wav");

Speak SpeakAsync.
,
SetOutputToDefaultAudioDevice.

SSML PromptBuilder
SpeechSynthesizer ,
, .
SpeechSynthesizer XML-,
Speech Synthesis Markup Language (SSML).

. SSML
SpeechSynthesizer SpeakSsml Speak
SsmlAsync, , , Speak
SpeakAsync, PromptBuilder.
PromptBuilder
. , SSML,
, , .

Speech Synthesis Markup Language (SSML) W3C,


http://w3.org/TR/speech-synthesis.

PromptBuilder ,
SpeakAsync:

736

18. ,

SpeechSynthesizer synthesizer = new SpeechSynthesizer();


PromptBuilder promptBuilder = new PromptBuilder();
promptBuilder.AppendTextWithHint("WPF", SayAs.SpellOut);
promptBuilder.AppendText("sounds better than WPF.");
//
promptBuilder.AppendBreak(new TimeSpan(0, 0, 2));
promptBuilder.AppendText("The time is");
promptBuilder.AppendTextWithHint(DateTime.Now.ToString("hh:mm"), SayAs.Time);
//
promptBuilder.AppendBreak(new TimeSpan(0, 0, 2));
promptBuilder.AppendText("Hey Sam, can you spell queue?");
promptBuilder.StartVoice("Microsoft Sam");
promptBuilder.AppendTextWithHint("queue", SayAs.SpellOut);
promptBuilder.EndVoice();
promptBuilder.AppendText("Do it faster!");
promptBuilder.StartVoice("Microsoft Sam");
promptBuilder.StartStyle(new PromptStyle(PromptRate.ExtraFast));
promptBuilder.AppendTextWithHint("queue", SayAs.SpellOut);
promptBuilder.EndStyle();
promptBuilder.EndVoice();
// , PromptBuilder
synthesizer.SpeakAsync(promptBuilder);

PromptBuilder,
. AppendTextWithHint (
WPF ), , (,
08:25) .
StartXXX/EndXXX,
.
, XML,
SSML-.


PromptBuilder SSML
SSML- PromptBuilder, ToXml
( ,
, StartXXX
EndXXX).
PromptBuilder, (8:25 ):

737

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"


xml:lang="en-US">
<say-as interpret-as="characters">WPF</say-as>
sounds better than WPF
<break time="2000ms"/>
The time is
<say-as interpret-as="time">08:25</say-as>
<break time="2000ms"/>
Hey Bob, can you spell queue?
<voice name="Microsoft Sam">
<say-as interpret-as="characters">queue</say-as>
</voice>
Do it faster!
<voice name="Microsoft Sam">
<prosody rate="x-fast">
<say-as interpret-as="characters">queue</say-as>
</prosody>
</voice>
</speak>

,
.

SpeechSynthesizer
WAV! :
promptBuilder.AppendAudio("sound.wav");

( SSML-,
SpeakSsml SpeakSsmlAsync.)
Speak
SpeakAsync, , Prompt,
FilePrompt. FilePrompt
, SSML WAV:
synthesizer.SpeakAsync(new FilePrompt("text.txt", SynthesisMediaType.Text));
synthesizer.SpeakAsync(new FilePrompt("content.ssml", SynthesisMediaType.Ssml));
synthesizer.SpeakAsync(new FilePrompt("sound.wav", SynthesisMediaType.WaveAudio));


, .

.

738

18. ,

,
. Windows Vista
, Office XP .
http://microsoft.com/speech.
Windows ,

.



System.Speech.dll ( , ).
System.Speech.Recognition.

, SpeechRecognizer,
SpeechRecognized:
SpeechRecognizer recognizer = new SpeechRecognizer();
recognizer.LoadGrammar(new DictationGrammar());
recognizer.SpeechRecognized +=
new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);

DictationGrammar , .NET
Framework, .
SpeechRecognized ,
,
:
void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result != null)
textBox.Text += e.Result.Text + " ";
}


, SpeechRecognizer
, .18.4.
! , ,
SpeechRecognizer
, Windows. ,
.18.5.
Windows
, SpeechRecognitionEngine Speech
Recognizer. ,
, ,
:

739

SpeechRecognitionEngine engine = new SpeechRecognitionEngine();


engine.LoadGrammar(new DictationGrammar());
engine.SetInputToDefaultAudioDevice();
// , RecognizeAsyncStop
// RecognizeAsyncCancel:
engine.RecognizeAsync(RecognizeMode.Multiple);
// , :
engine.SpeechRecognized +=
new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);

.18.4. ,

.18.5. Windows ,

, , SpeechRecognizer

SpeechRecognitionEngine , Spe
echRecognizer, .
( ,

740

18. ,

WAV- ) ,
, Recognize RecognizeAsync. Recognize
Async RecognizeMode.Multiple,
, RecognizeAsyncStop
RecognizeAsyncCancel. RecognizeAsyncStop
, RecognizeAsyncCancel
. SpeechRecognized SpeechRecognitionEngine
, SpeechRecognizer,
recognizer_SpeechRecognized .

SpeechRecognitionEngine
SpeechRecognizer. Win
dows, ,
Start File
( ). SpeechRecog
nitionEngine ,
, .

recognizer_
SpeechRecognized TextBox. Win
dows Vista ,
! ,
WPF TextBox, , ,
, .18.6.
, Windows
UI Automation, WPF.
, ,
! ( WPF, Win
dows Forms
, Windows.)

.18.6. WPF TextBox


Windows Speech Recognition

741

,
, ,
. ,
, , .
, SpeechRecognizer
SpeechRecognitionEngine , .
SRGS.

SRGS
SpeechRecognized,
, ,
.
,
. ,
go, goat, ,
?
, SpeechRecognizer Speech
RecognitionEngine
Speech Recognition Grammar Specification (SRGS). ,
,

.

Speech Recognition Grammar Specification (SRGS)


W3C, http://w3.org/TR/speechgrammar.

, LoadGrammar,
. SRGS- XML,
XML-
:
SpeechRecognitionEngine engine = new SpeechRecognitionEngine();
SrgsDocument doc = new SrgsDocument("grammar.xml");
engine.LoadGrammar(new Grammar(doc));

SrgsDocument ( , SRGS)
System.Speech.Recognition.SrgsGrammar.
SrgsDocument ,
API. , ,
: stop go:
SpeechRecognitionEngine engine = new SpeechRecognitionEngine();
SrgsDocument doc = new SrgsDocument();
SrgsRule command = new SrgsRule("command", new SrgsOneOf("stop", "go"));

742

18. ,

doc.Rules.Add(command);
doc.Root = command;
engine.LoadGrammar(new Grammar(doc));

.
, three
of hearts ( ) ace of spades ( ):
SpeechRecognitionEngine engine = new SpeechRecognitionEngine();
SrgsDocument doc = new SrgsDocument();
SrgsRule command = new SrgsRule("command");
SrgsRule rank = new SrgsRule("rank");
SrgsItem of = new SrgsItem("of");
SrgsRule suit = new SrgsRule("suit");
SrgsItem card = new SrgsItem(new SrgsRuleRef(rank), of, new SrgsRuleRef(suit));
command.Add(card);
rank.Add(new SrgsOneOf("two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "jack", "queen", "king", "ace"));
of.SetRepeat(0, 1);
suit.Add(new SrgsOneOf("clubs", "diamonds", "spades", "hearts"));
doc.Rules.Add(command, rank, suit);
doc.Root = command;
engine.LoadGrammar(new Grammar(doc));

rank of suit ( ),
rank () 13 , suit () 4 ,
of ( SetRepeat,
, ).

GrammarBuilder
API System.Speech.
Recognition.SrgsGrammar SRGS XML (
) . Sys
tem.Speech.Recognition GrammarBuilder,

API. Grammar (
LoadGrammar) ,
GrammarBuilder, ,
SrgsDocument.
, , GrammarBuilder
:
SpeechRecognitionEngine engine = new SpeechRecognitionEngine();
GrammarBuilder builder = new GrammarBuilder(new Choices("stop", "go"));
engine.LoadGrammar(new Grammar(builder));

:
SpeechRecognitionEngine engine = new SpeechRecognitionEngine();
GrammarBuilder builder = new GrammarBuilder();
builder.Append(new Choices("two", "three", "four", "five", "six", "seven",

743

"eight", "nine", "ten", "jack", "queen", "king", "ace"));


builder.Append("of", 0, 1);
builder.Append(new Choices("clubs", "diamonds", "spades", "hearts"));
engine.LoadGrammar(new Grammar(builder));

GrammarBuilder SrgsDocument,
.
two clubs ( ) too uh cubs,
SpeechRecognized two of
clubs. ,
, ,
, .

, WPF
. ,
.
Windows Media Player,
WPF (,
, )
.
WPF ,
,
Microsoft SAPI.

VI
VI.

19
20
21

Win32 WPF-




WPF Win32-

Windows Forms WPF-

WPF Windows Forms
DirectX
WPF

ActiveX WPF-

19


19.

Windows Presentation Foundation,


- , .
WPF
. , WPF
,
Windows Forms: NumericUpDown, NotifyIcon . , Windows Forms
(MDI) ,
API Win32
, Screen.AllScreens (
). Win32
, IP- (SysIPAddress32),
Windows Forms, WPF. Win
dows
Win32, - WPF,
, .
ActiveX,
. ,
, WPF,
WPF-. ,
DirectX
HTML.
, WPF

. -
(, )

748

19.

, ,
WPF. -
HTML-, ,
.
WPF HTML.
, HTML- WPF- Frame
WebBrowser, WPF- HTML- (
XBAP- XAML-),
HTML- (
, Silverlight, Flash )
WPF-. , WPF
. WPF-
API,
, .
, ,
.NET Framework
, ( WPF API
Windows Forms) ,
, , WPF.
. 19.1
. Win32
, ,
Windows: MFC, WTL, OpenGL . ,
WPF , Silverlight ActiveX,
.
- . Silverlight
HTML, Visual Studio Expression
Blend. , , HostingRenderTargetBitmap,
Silverlight-
, WPF- InteropBitmap WriteableBitmap.
, .
,
. Win32 Windows Forms
.NET Framework
( , Windows
Forms Win32), Win32 ActiveX/DirectX
, Win32 ActiveX DirectX -
.

.
WPF Win32,
WPF Windows Forms.
WPF DirectX ,
.
WPF

749

ActiveX.
, ,
, :
.
Silverlight

DirectX

WPF

HTML

Win32
(MFC, OpenGL,)

Windows Forms

ActiveX

.19.1.
Windows

-WPF- WPF-
( D3DImage)!
HTML- Frame WebBrowser,
-WPF-, WPF-,
, WPF-
. , -WPF-
Transform. , ,
, , .
Win32- WPF-, Win
dows Forms, , , WPF-,
, :
.
DirectX
D3DImage, WPF
DirectX.
WPF DirectX,
(DirectX).

750

19.

Win32
WPF-
Win32 , Win32 API
, HWND.
Windows (
, DirectX MFC) HWND,
HWND .
WPF (, ..)
HWND , WPF FrameworkElement,
HWND. System.Windows.Interop.
HwndHost; HWND
, WPF.
HwndHost WPF-
Win32, WPF-
-. WPF

, -. Microsoft
DirectShow ,
Win32 WPF-.

Win32 Webcam
19.1 Win32 Webcam
C++. COM- Direct
Show.
19.1. Webcam.h API Webcam
#if !defined(WEBCAM_H)
#define WEBCAM_H
#include <wtypes.h>
class Webcam
{
public:
static HRESULT Initialize(int width, int height);
static HRESULT AttachToWindow(HWND hwnd);
static HRESULT Start();
static HRESULT Pause();
static HRESULT Stop();
static HRESULT Repaint();
static HRESULT Terminate();
static int GetWidth();
static int GetHeight();
};
#endif // !defined(WEBCAM_H)

Win32 WPF-

751

Webcam ,
,
.
(
GetWidth GetHeight). , Webcam (
AttachToWindow), HWND ,
Start, Pause Stop.
19.2 Webcam.
Webcam::Initialize Webcam::Terminate , ,
(http://informit.com/title/9780672331190), .
19.2. Webcam.cpp Webcam
LRESULT WINAPI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_ERASEBKGND:
DefWindowProc(hwnd, msg, wParam, lParam);
Webcam::Repaint();
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
HRESULT Webcam::Initialize(int width, int height)
{
_width = width;
_height = height;
//
WNDCLASS wc;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = GetModuleHandle(NULL);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_SCROLLBAR+1);
wc.lpszMenuName = 0;
wc.lpszClassName = L"WebcamClass";
RegisterClass(&wc);
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&_graphBuilder);
... COM- ...

752

19.

return hr;
}
HRESULT Webcam::AttachToWindow(HWND hwnd)
{
if (!_initialized || !_windowlessControl)
return E_FAIL;
_hwnd = hwnd;
//
RECT rcDest;
rcDest.left = 0;
rcDest.right = _width;
rcDest.top = 0;
rcDest.bottom = _height;
_windowlessControl->SetVideoClippingWindow(hwnd);
return _windowlessControl->SetVideoPosition(NULL, &rcDest);
}
HRESULT Webcam::Start()
{
if (!_initialized || !_graphBuilder || !_mediaControl)
return E_FAIL;
_graphBuilder->Render(_pin);
return _mediaControl->Run();
}
HRESULT Webcam::Pause()
{
if (!_initialized || !_mediaControl)
return E_FAIL;
return _mediaControl->Pause();
}
HRESULT Webcam::Stop()
{
if (!_initialized || !_mediaControl)
return E_FAIL;
return _mediaControl->Stop();
}
HRESULT Webcam::Repaint()
{
if (!_initialized || !_windowlessControl)
return E_FAIL;
return _windowlessControl->RepaintVideo(_hwnd, GetDC(_hwnd));
}
HRESULT Webcam::Terminate()

Win32 WPF-

753

{
HRESULT hr = Webcam::Stop();
... COM-...
return hr;
}
int Webcam::GetWidth()
{
return _width;
}
int Webcam::GetHeight()
{
return _height;
}

Win32,
,
WM_ERASEBKGND. Initialize
WebcamClass, COM-,
DirectShow. ( Terminate.)
AttachToWindow DirectShow, ,
,
Initialize.
DirectShow.

Webcam WPF
Webcam WPF-
,
, WPF.
.
C++, C++/CLI.
Webcam,
DLL, .

FAQ
C++/CLI?
C++/CLI C++ .
Managed C++,
Visual C++, C++/CLI
.NET C++. ( CLI
Common Language Infrastructure
Ecma .NET
Framework.) C++/CLI Ecma ( CLI C#).

754

19.

, Visual C++ C++/CLI


Microsoft, Visual C# C# Microsoft,
(CLR) CLI Micro
soft. Visual C++
/clr,
,
.



C++/CLI -
( )
. .NET Framework -
( ,
.NET- ):
- ( PInvoke).
DLL
,
. Declare Visual Basic 6.
COM. COM-
, ,
.
C++/CLI PInvoke
COM:
DLL.
DLL ,
.
API , ,
, .
PInvoke ,
.
COM- ,
COM.
, COM-
, Visual C++ (,
com_handle), .

19.3 WPF Window C++/


CLI Win32 Webcam
HwndHost.
, /clr.

Win32 WPF-

755

Visual C++ XAML!


19.3 Window
. XAML-
( 2 XAML) Window
, XAML.

19.3. Window1.h WPF Window ,


HwndHost
#include "stdafx.h"
#include "Webcam.h"
#using
#using
#using
#using
using
using
using
using
using

<mscorlib.dll>
<PresentationFramework.dll>
<WindowsBase.dll>
<PresentationCore.dll>
namespace
namespace
namespace
namespace
namespace

System;
System::Windows;
System::Windows::Controls;
System::Windows::Interop;
System::Runtime::InteropServices;

ref class MyHwndHost : HwndHost


{
protected:
virtual HandleRef BuildWindowCore(HandleRef hwndParent) override
{
HWND hwnd = CreateWindow(L"WebcamClass", //
NULL, //
WS_CHILD, //
CW_USEDEFAULT, 0, //
Webcam::GetWidth(), //
Webcam::GetHeight(), //
(HWND)hwndParent.Handle.ToInt32(), //
NULL, //
GetModuleHandle(NULL), // hInstance
NULL); //
if (hwnd == NULL)
throw gcnew ApplicationException("CreateWindow failed!");
Webcam::AttachToWindow(hwnd);
return HandleRef(this, IntPtr(hwnd));
}

756

19.

virtual void DestroyWindowCore(HandleRef hwnd) override


{
// :
::DestroyWindow((HWND)hwnd.Handle.ToInt32());
}
};
ref class Window1 : Window
{
public:
Window1()
{
DockPanel^ panel = gcnew DockPanel();
MyHwndHost^ host = gcnew MyHwndHost();
Label^ label = gcnew Label();
label->FontSize = 20;
label->Content = "The Win32 control is docked to the left.";
panel->Children->Add(host);
panel->Children->Add(label);
this->Content = panel;
if (FAILED(Webcam::Initialize(640, 480)))
{
::MessageBox(NULL, L"Failed to communicate with a video capture device.",
L"Error", 0);
}
Webcam::Start();
}
~Window1()
{
Webcam::Terminate();
}
};

, 19.3,
MyHwndHost HwndHost. , HwndHost
. , :
BuildWindowCore HWND .
.
HWND. HWND,
, WPF
InvalidOperationException.
DestroyWindowCore ,
HWND .
HWND HandleRef. (
System.Runtime.InteropServices),
HWND . Hand
leRef this .

Win32 WPF-

757

19.3 BuildWindowCore Win32


API CreateWindow WebcamClass,
19.2;
HWND. HWND,
CreateWindow ( HandleRef),
BuildWindowCore, Webcam::Attach
ToWindow, . DestroyWindow
Core Win32 API DestroyWindow, HWND.

HwndHost CreateWindow
BuildWindowCore, DestroyWindow DestroyWindowCore.
, , DestroyWindow , ,
Win32 HWND
. 19.3 DestroyWindowCore
.

Window MyHwndHost
DockPanel, FrameworkElement.
Webcam .

Win32
, WPF-.
ContentRen
dered Window.

19.4 WPF- webcam


main, Window Application.
/clr. .19.2
.
19.4. HostingWin32.cpp
#include "Window1.h"
using namespace System;
using namespace System::Windows;
using namespace System::Windows::Media;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{

758

19.

Application^ application = gcnew Application();


Window^ window = gcnew Window1();
window->Title = "Hosting Win32 DirectShow Content in WPF";
window->Background = Brushes::Orange;
application->Run(window);
return 0;
}

.19.2. , -, WPF-

/clr Visual C++


, .
,
.
, .
/clr , ,
. , /clr C-
C++,
. ,
, Windows,
DllMain ( )
(,
).
, /clr
(, /Gm /EHsc). ,
, .

Win32 WPF-

759

.19.2.
. MyHwndHost
DockPanel, Webcam
(640480).
Webcam::AttachToWindow
19.2 , HWND,
. ,
.19.3.
HRESULT Webcam::AttachToWindow(HWND hwnd)
{
if (!_initialized || !_windowlessControl)
return E_FAIL;
_hwnd = hwnd;
//
RECT rcDest;
GetClientRect(hwnd, &rcDest);
_windowlessControl->SetVideoClippingWindow(hwnd);
return _windowlessControl->SetVideoPosition(NULL, &rcDest);
}

.19.3. Webcam

,
HwndHost (, ,
). , WPF

760

19.

HwndHost.
Win32.


,
, HwndHost
, WPF-
Win32- .
Webcam ,
. , ,
- :
Win32- Tab
Win32- Tab

.19.4 WPF Window
WPF, Win32
( HwndHost)
Win32. .
.
WPF (1, 6 HwndHost, 25)

,
TabIndex. Win32 (25),
.

.19.4. ,
Win32

Win32
Win32 :
WPF,
Tab
Win32. .19.4 1 2.
WPF,
Shift+Tab
Win32. .19.4 6 5.

Win32 WPF-

761


HwndHost TabInto, , HwndHost
Tab Shift+Tab. C++/CLI
:
virtual bool TabInto(TraversalRequest^ request) override
{
if (request->FocusNavigationDirection == FocusNavigationDirection::Next)
SetFocus(hwndForFirstWin32Control);
else
SetFocus(hwndForLastWin32Control);
return true;
}

TabInto ,
: Tab ( FocusNavigationDirection.Next) Shift+Tab (
FocusNavigationDirection.Previous). ,
, : .
Win32 API SetFocus.
, true, ,
.

Win32
, , Win32 .
,
Win32. . 19.4
Win32 5 6 Tab
2 1 Shift+Tab.
. ,
Win32, WPF
. - Windows
, HwndHost,
WPF , .
TabOutOf, ,
. TranslateAccelerator, ,
Windows WM_KEYDOWN WM_SYSKEYDOWN (
Win32 API). 19.5
TranslateAccelerator C++/CLI;
Win32 ( ).
19.5. TranslateAccelerator C++/CLI
virtual bool TranslateAccelerator(MSG% msg, ModifierKeys modifiers) override
{
if (msg.message == WM_KEYDOWN && msg.wParam == IntPtr(VK_TAB))
{
// Shift+Tab
if (GetKeyState(VK_SHIFT))

762

19.

{
if (GetFocus() == hwndOfFirstControl)
{
// ,

// WPF
return this->KeyboardInputSite->OnNoMoreTabStops(
gcnew TraversalRequest(FocusNavigationDirection::Previous));
}
else
return (SetFocus(hwndOfPreviousControl) != NULL);
}
// Shift Tab
else
{
if (GetFocus() == hwndOfLastControl)
{
// ,

// WPF
return this->KeyboardInputSite->OnNoMoreTabStops(
gcnew TraversalRequest(FocusNavigationDirection::Next));
}
else
return (SetFocus(hwndOfNextControl) != NULL);
}
}
}

TranslateAccelerator Win
dows ( System.Windows.Interop.
MSG) ModifierKeys, ,
- Shift, Alt, Ctrl Windows. (
Win32 API GetKeyState.)
,
WM_KEYDOWN Tab (
Shift+Tab). GetKeyState,
Tab Shift+Tab, ,
.
,
Shift+Tab
Tab.
OnNoMoreTabStops , Key
boardInputSite HwndHost. WPF,
. OnNoMoreTabStops
FocusNavigationDirection, ,
WPF (1 6 .19.4).
TranslateAccelerator true,
.
. 19.5 :

Win32 WPF-

763

hwndOfPreviousControl hwndOfNextControl
, HWND
, Win32 .
TranslateAccelerator TabInto
. 19.4 Tab
Shift+Tab 1 6 6 1 .

C++/CLI
TranslateAccelerator!
Windows winuser.h TranslateAccelera
tor Win32 TranslateAcceleratorW (
UNICODE) TranslateAcceleratorA (
UNICODE).
C++ , Win32,
WPF- TranslateAccelerator.
,
TranslateAccelerator:
#undef TranslateAccelerator


, ,
(
). , . 19.4,
, (
). WPF-,
, Alt
.
OnMnemonic
HwndHost. TranslateAccelerator,
Windows ModifierKeys.
, a b, :
virtual bool OnMnemonic(MSG% msg, ModifierKeys modifiers) override
{
// ,
if (msg.message == WM_SYSCHAR && (modifiers | ModifierKeys.Alt))
{
// IntPtr char
char key = (char)msg.wParam.ToPointer();
// 'a' 'b'
if (key == 'a')

764

19.

return (SetFocus(someHwnd) != NULL);


else if (key == 'b')
return (SetFocus(someOtherHwnd) != NULL);
}
return false;
}

C++/CLI Visual C++ 2005,


.
-
ISO
Windows. ,
Visual C++
.

FAQ
Win32 WPF-?

(, Win32 DialogBox). C++/CLI
. C#
PInvoke. ,
HWND WPF Window,
.
, HWND WPF- Window
WindowInteropHelper System.Windows.Interop. C++/
CLI :
WindowInteropHelper^ helper = gcnew WindowInteropHelper(wpfParentWindow);
HWND hwnd = (HWND)helper->Handle.ToPointer();
DialogBox(hinst, MAKEINTRESOURCE(MYDIALOG), hwnd, (DLGPROC)MyDialogProc);

WPF
Win32-
Win32- WPF:
, , ,
. ,
,
.

WPF Win32-

765

HWND ,
WPF Win32-
, Win32 WPF-.
, WPF DocumentViewer,
XPS-, Win32- Hwnd
Source.

HwndSource
HwndSource HwndHost:
WPF Visual HWND. 19.6
HwndSource C++ Win32,
, .
/clr, ,
, .
19.6. HostingWPF.cpp
Win32
#include "stdafx.h"
#include "HostingWPF.h"
#include "commctrl.h"
#using <PresentationFramework.dll>
#using <PresentationCore.dll>
#using <WindowsBase.dll>
LRESULT CALLBACK DialogFunction(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
// HwndSource
System::Windows::Interop::HwndSourceParameters p;
p.Windowstyle = WS_VISIBLE | WS_CHILD;
p.PositionX = 10;
p.PositionY = 10;
p.Width = 500;
p.Height = 350;
p.ParentWindow = System::IntPtr(hDlg);
System::Windows::Interop::HwndSource^ source =
gcnew System::Windows::Interop::HwndSource(p);
// DocumentViewer HwndSource
source->RootVisual = gcnew System::Windows::Controls::DocumentViewer();

766

19.

return TRUE;
}
case WM_CLOSE:
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
return FALSE;
}
[System::STAThread]
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, (LPCTSTR)IDD_MYDIALOG, NULL, (DLGPROC)DialogFunction);
return 0;
}

Win32
( ). (_tWinMain)
Win32 DialogBox,
DialogFunction ,
Win32.
DialogFunction : WM_
INITDIALOG, WPF
, WM_CLOSE, .
WM_INITDIALOG HwndSourceParameters
, HwndSource
, .
HWND ( ).
Win32
. , Win32
CreateWindow.
HwndSourceParameters
, WPF-:
HwndSource, HwndSourceParameters,
RootVisual ( System.Windows.Media.Visual)
, DocumentViewer.
.19.5.
WPF,

WPF-.
(, Grid Page) HwndSource
Win32 HWND.

WPF Win32-

767

.19.5. WPF DocumentViewer,


Win32

WPF STA-!
Windows Forms ,
, WPF,
. 19.6
STAThreadAttribute, ,
MTA-.
, Visual C++,
STA
/CLRTHREADATTRIBUTE:STA. ,
.
STAThreadAttribute, .

Visual C++ Mixed!


Win32- WPF- (
) DLL-,
, .
- .
Visual C++ Auto,

. EXE- DLL,
, ,
, .
Mixed ().

768

19.

HwndSource HWND,
Win32 ,
HwndSourceParameters.Name. HwndSource
RootVisual WPF- ,
, , WPF Window
Content .
Window HwndSource, ,
. HwndSource ,
,
, Window
( ,
Application.Run).



Win32, WPF
. 19.6 DocumentViewer
(10,10) (500,350). ,
, .
19.7 , DocumentViewer
, . .19.6.
19.7. HostingWPF.cpp WPF
#include "stdafx.h"
#include "HostingWPF.h"
#include "commctrl.h"
#using <PresentationFramework.dll>
#using <PresentationCore.dll>
#using <WindowsBase.dll>
ref class Globals
{
public:
static System::Windows::Interop::HwndSource^ source;
};
LRESULT CALLBACK DialogFunction(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
System::Windows::Interop::HwndSourceParameters p;

WPF Win32-

769

p.Windowstyle = WS_VISIBLE | WS_CHILD;


// ,
// WM_SIZE:
p.PositionX = 0; p.PositionY = 0;
p.Width = 100; p.Height = 100;
p.ParentWindow = System::IntPtr(hDlg);
Globals::source = gcnew System::Windows::Interop::HwndSource(p);
Globals::source->RootVisual =
gcnew System::Windows::Controls::DocumentViewer();
return TRUE;
}
case WM_SIZE:
RECT r;
GetClientRect(hDlg, &r);
SetWindowPos((HWND)Globals::source->Handle.ToPointer(), NULL,
r.left, r.top, r.right - r.left, r.bottom - r.top, 0);
return TRUE;
case WM_CLOSE:
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
return FALSE;
}
[System::STAThreadAttribute]
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, (LPCTSTR)IDD_MYDIALOG, NULL, (DLGPROC)DialogFunction);
return 0;
}

.19.6. WPF DocumentViewer


Win32

19.7 WM_SIZE.
Win32 API GetClientRect
, HwndSource

770

19.

Win32 API SetWindowPos.


:
HwndSource ,
. C++/CLI -
,
.
HwndSource Win32 API,
SetWindowPos, HWND. Handle
IntPtr. C++/CLI ToPointer (
void*) HWND.

HwndSource , HWND.
HwndSource FromHwnd,
HwndSource, HWND (, ,
HWND HwndSource).
Win32 WPF-,
HWND .
Globals.

HwndSource WPF-
Windows. WPF-

Windows. , Windows ;
- HWND Win32.
, WPF Window
HwndSource HWND
. WPF ,
-. , WPF WM_SIZE
SizeChanged. Windows,
WPF . WPF Window
HwndSource, .
System.Windows.Interop.WindowInteropHelper,
HWND WPF Window. ,
HwndSource ( HwndSource.FromHwnd)
, HwndSource AddHook.
8 Windows7 ,
WM_DWMCOMPOSITIONCHANGED. Window
WM_TCARD, Windows Help

:

WPF Win32-

771

public partial class AdvancedWindow : Window


{
...
void AdvancedWindow_Loaded(object sender, RoutedEventArgs e)
{
// HWND Window
IntPtr hwnd = new WindowInteropHelper(this).Handle;
// HwndSource, HWND
HwndSource source = HwndSource.FromHwnd(hwnd);
// HwndSource
source.AddHook(new HwndSourceHook(WndProc));
}
private static IntPtr WndProc(
IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
// Win32
if (msg == WM_TCARD)
{
...
handled = true;
}
return IntPtr.Zero;
}
// Win32
private const int WM_TCARD = 0x0052;
}

FAQ
WPF Win32-?
WPF Window Win32- WPF-,
ShowDialog.
, WPF Window .


, ..
, Owner Window Window,
,
HWND. , Window
HWND.

772

19.

, WindowInteropHelper
System.Windows.Interop. HWND
WPF Window, HWND.
C++/CLI :
Nullable<bool> LaunchWpfDialogFromWin32Window(Window^ dialog, HWND parent)
{
WindowInteropHelper^ helper = gcnew WindowInteropHelper(dialog);
helper->Owner = parent;
return dialog->ShowDialog();
}


WindowsForms WPF-
, WPF-
Win32, HWND HwndHost.
Windows Forms Win32. (
WPF, HWND,
System.Windows.Forms.Control Handle,
HWND.) , Win
dows Forms WPF-
.
Windows Forms
WPF, HWND. ,
, . ,
.NET
(,
), Win32.
WPF, ,
Windows Forms.
- HWND,
, ,
.
,
.
Win32, WPF ,
. HwndHost
WindowsFormsHost System.Windows.Forms.
Integration ( WindowsFormsIntegration.dll).

WindowsForms WPF-

773

PropertyGrid

, Windows Forms
, WPF.
PropertyGrid
Windows Forms WPF, WPF
Window. (, Windows
Forms .)
WPF- System.Windows.
Forms.dll WindowsFormsIntegration.dll.
Windows Forms
Loaded Window. ,
Window, Grid grid:
<Window x:Class="HostingWindowsFormsControl.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Hosting a Windows Forms Property Grid in WPF"
Loaded="Window_Loaded">
<Grid Name="grid"/>
</Window>

Loaded Grid
PropertyGrid, WindowsFormsHost
:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// PropertyGrid
System.Windows.Forms.Integration.WindowsFormsHost host =
new System.Windows.Forms.Integration.WindowsFormsHost();
System.Windows.Forms.PropertyGrid propertyGrid =
new System.Windows.Forms.PropertyGrid();
// PropertyGrid , Grid
host.Child = propertyGrid;
grid.Children.Add(host);
// PropertyGrid
propertyGrid.SelectedObject = this;
}

WindowsFormsHost
Child .
, System.
Windows.Forms.Control.
SelectedObject Proper
tyGrid WPF Window,
. PropertyGrid

774

19.

, .NET.
. WPF
.NET, PropertyGrid
.
.19.7 Window .
, ,
; ,
, , ..

.19.7. Windows Forms PropertyGrid


WPF Window

, , HorizontalContentAlignment,

.NET.
.19.7 Windows Forms WPF
, .NET. ,
Window : Behavior (), Content (
) Layout (). Category
Attribute, Windows Forms, WPF.
, WPF, Windows Forms,
, , red (),
ARGB (#FFFF0000).
PropertyGrid ,
, ,
.

WindowsForms WPF-

775

WindowsFormsHost HwndHost,
HWND, .
,
, WndProc.

PropertyGrid XAML
WindowsFormsHost
; XAML-. ,
XAML
XAML . (
, - ..,
XAML2009.)
Windows Forms XAML,
PropertyGrid . ,
XAML- :
<Window x:Class="HostingWindowsFormsControl.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:swf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="Hosting a Windows Forms Property Grid in WPF"
Loaded="Window_Loaded" x:Name="rootWindow">
<Grid>
<WindowsFormsHost>
<swf:PropertyGrid x:Name="propertyGrid"
SelectedObject="{x:Reference rootWindow}"/>
</WindowsFormsHost>
</Grid>
</Window>

System.Windows.Forms.Integration
, WindowsFormsHost
, ,
WindowsFormsIntegration.dll.
.NET System.Windows.Forms swf, PropertyGrid
XAML-. , PropertyGrid
WindowsFormsHost,
Child . PropertyGrid
XAML, C#.
x:Reference, SelectedObject
Window ( rootWindow), ,
, !

776

19.

,
XAML2009, XAML-.
, WPF4,
XAML2006 , .NET Framework
4 . ,
XAML Visual Studio 2010
x:Reference, ,
:
Service provider is missing the INameResolver service

Windows
Forms, WPF-, .
, Windows XP,
Win32 Common Controls.
, ,
- System.Windows.Forms.Application.EnableVisual
Styles Windows Forms. Visual Studio
Windows Forms ,
WPF .

FAQ
Windows Forms
WPF-?
; ,
Form, ShowDialog. ,
,
ShowDialog, owner.
IWin32Window, WPF Window.
, HWND WPF
Window WindowInteropHelper System.
Windows.Interop, IWin32Window?
, . , ,
IWin32Window Handle.
OwnerWindow,
:
class OwnerWindow : IWin32Window
{
private IntPtr handle;
public IntPtr Handle

WPF Windows Forms

777

{
get { return handle; }
set { handle = value; }
}
}

, ,
Windows Forms, WPF Window:
DialogResult LaunchWindowsFormsDialogFromWpfWindow(Form dialog, Window parent)
{
WindowInteropHelper helper = new WindowInteropHelper(parent);
OwnerWindow owner = new OwnerWindow();
owner.Handle = helper.Handle;
return dialog.ShowDialog(owner);
}

WPF
Windows Forms
WPF Windows Forms
ElementHost, WindowsFormsHost.
ElementHost HwndSource,
WPF Windows Forms Form,
HWND. ElementHost Windows Forms (
System.Windows.Forms.Control), ,
WPF-.
ElementHost
Windows Forms, WPF
Expander. Visual Studio Windows
Forms, ElementHost , Tools
() Choose Toolbox Items (
). , .19.8.
ElementHost ,
, Windows Forms.
WPF (Presentation
Framework.dll, PresentationCore.dll ..). 19.8
Windows Forms, Form
ElementHost elementHost, ,
Label .
19.8. Form1.cs WPF Expander
Windows Forms Form
using System.Windows.Forms;
using System.Windows.Controls;

778

19.

namespace WindowsFormsHostingWPF
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// WPF Expander
Expander expander = new Expander();
expander.Header = "WPF Expander";
expander.Content = "Content";
// ElementHost
elementHost.Child = expander;
}
}
}

.19.8. ElementHost Windows Forms

System.Windows.Controls
Expander.
. WindowsFormsHost, ElementHost Child,
UIElement.
,
Windows Forms, Expander.
.19.9. , Expander
, ElementHost.

WPF Windows Forms

779

.19.9. Windows Forms,


WPF Expander

, ElementHost Win
dowsFormsHost, Windows Forms,
WPF, Windows Forms! ,
, Content WPF Expander
WindowsFormsHost,
Windows Forms. 19.9 ,
Windows Forms MonthCalendar WPF
Expander, Windows Forms. .19.10.
19.9. Form1.cs Windows Forms WPF

using System.Windows.Forms;
using System.Windows.Controls;
using System.Windows.Forms.Integration;
namespace WindowsFormsHostingWPF
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// WPF Expander
Expander expander = new Expander();
expander.Header = "WPF Expander";
// MonthCalendar WindowsFormsHost
WindowsFormsHost host = new WindowsFormsHost();
host.Child = new MonthCalendar();

780

19.

// WindowsFormsHost Expander
expander.Content = host;
// Expander ElementHost
elementHost.Child = expander;
}
}
}

.19.10. Windows Forms MonthCalendar


WPF Expander, Windows Forms



,
Windows Forms/WPF,
, . , WPF
Color, Cursor, Size, Rect Point, Color, Cursor,
Size, Rectangle Point, Windows Forms.
. :
Color FromArgb,
Color
A, R, G, B Color.
Windows Forms WPF,
0,75. WPF
Windows Forms, 0,75.
. ,
System.Drawing.Bitmap System.Windows.Media.Imaging.BitmapSource
, ,
Win32 HBITMAP.

DirectX WPF

781

Windows Forms Bitmap HBITMAP,


GetHbitmap, ( IntPtr).
, BitmapSource WPF HBITMAP, ,
, System.Windows.Interop.Imaging,
BitmapSource
, HICON HBITMAP. Crea
teBitmapSourceFromHBitmap ,
Windows Forms Bitmap, WPF.

FAQ
WPF
Windows Forms?
,
WPF Win32-. , Win
dow, ShowDialog. , ,
Owner. Owner Window,
Windows Forms , , ,
System.Windows.Forms.Form.
WindowInteropHelper,
HWND. ,
Owner , Handle
Form. :
bool? LaunchWpfDialogFromWindowsForm(Window dialog, Form parent)
{
WindowInteropHelper helper = new WindowInteropHelper(dialog);
helper.Owner = parent.Handle;
return dialog.ShowDialog();
}

DirectX
WPF
Windows Forms, DirectX
WPF- HwndHost, WPF- Di
rectX HwndSource. WPF
HWND WPF DirectX.
, WPF DirectX,

- HWND.
WPF3.5 SP1 (WPF3.0 SP2)
WPF DirectX .
ImageSource D3DImage
,

782

19.

, .
, ,
,
WPF. D3DImage HWND;
.
D3DImage ,
DirectX. ( ,
, .) D3DImage
ImageSource, Image, Image
Brush ImageDrawing.
D3DImage ,
, . ,
C++, DirectX SDK. (
,
http://informit.com/title/9780672331190.) DirectX SDK
, EXE-
DLL. C# WPF-
DirectX , PInvoke
, API.
,
, Di
rectX, WPF.
.19.11.
19.10 XAML- WPF Window.
D3DImage, ImageBrush.
WPF 70-
, ,
, DirectX.

.19.11. WPF Window,


, DirectX, WPF

DirectX WPF

783

19.10. MainWindow.xaml WPF


DirectX-
<Window x:Class="WpfDirectX.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:interop="clr-namespace:System.Windows.Interop;assembly=PresentationCore"
Title="Mixing DirectX with WPF" Height="350" Width="400">
<Window.Background>
<ImageBrush>
<ImageBrush.ImageSource>
<interop:D3DImage x:Name="d3dImage"
IsFrontBufferAvailableChanged="d3dImage_IsFrontBufferAvailableChanged"/>
</ImageBrush.ImageSource>
</ImageBrush>
</Window.Background>
<Grid Margin="20" Opacity=".7" TextBlock.Foreground="White">
...
</Grid>
</Window>

IsFrontBufferAvailableChanged D3DImage.
DirectX
. ( ,
Ctrl+Alt+Delete
.) ,
( )
DirectX,
IsFrontBufferAvailable D3DImage.
D3DImage
DirectX ,
19.11.
19.11. MainWindow.xaml.cs D3DImage DirectX,
DLL-,
C++
using
using
using
using
using

System;
System.Runtime.InteropServices;
System.Windows;
System.Windows.Interop;
System.Windows.Media;

namespace WpfDirectX
{
// PInvoke
// C++, DirectXSample.dll
class Sample
{
[DllImport("DirectXSample.dll")]
internal static extern IntPtr Initialize(IntPtr hwnd, int width, int height);

784

19.

[DllImport("DirectXSample.dll")]
internal static extern void Render();
[DllImport("DirectXSample.dll")]
internal static extern void Cleanup();
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
// , HWND Window,
// , ,
//
d3dImage_IsFrontBufferAvailableChanged(this,
new DependencyPropertyChangedEventArgs());
}
private void d3dImage_IsFrontBufferAvailableChanged(object sender,
DependencyPropertyChangedEventArgs e)
{
if (d3dImage.IsFrontBufferAvailable)
{
// () :
IntPtr surface = Sample.Initialize(new WindowInteropHelper(this).Handle,
(int)this.Width, (int)this.Height);
if (surface != IntPtr.Zero)
{
d3dImage.Lock();
d3dImage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface);
d3dImage.Unlock();
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
}
else
{
// :
CompositionTarget.Rendering -= CompositionTarget_Rendering;
Sample.Cleanup();
}
}
// DirectX, WPF

DirectX WPF

785

private void CompositionTarget_Rendering(object sender, EventArgs e)


{
if (d3dImage.IsFrontBufferAvailable)
{
d3dImage.Lock();
Sample.Render();
// :
d3dImage.AddDirtyRect(new Int32Rect(0, 0,
d3dImage.PixelWidth, d3dImage.PixelHeight));
d3dImage.Unlock();
}
}
}
}

PInvoke
, DirectXSample.dll.
DirectXSample.dll ,
. ( ,
DirectX SDK http://microsoft.com.)
DirectX, ; Initialize, Render Cleanup
. Initialize HWND,
DirectX API Direct3D.
Initialize HWND,
MainWindow ( HWND ).
OnSourceInitialized ,
. WindowInteropHelper
HWND WPF Window.
d3dImage_IsFrontBufferAvailableChanged,
OnSourceInitialized.

HWND WPF Window , ,


EnsureHandle WindowInteropHelper.
Win32 ( SourceInitialized),
, HWND.
! , Visual Studio 2010
, .

d3dImage_IsFrontBufferAvailableChanged, ,
, Initialize,
HWND , ,
IDirect3DSurface9, IntPtr ( ,
). IntPtr
D3DImage.SetBackBuffer ( D3DImage ),
. Render

786

19.

,
Rendering CompositionTarget.
d3dImage_IsFrontBufferAvailableChanged, (
IsFrontBufferAvailable false),
Rendering Cleanup,
C++ .

, WPF Direct3D!
, ,
, .
, ,
, WPF ,
SetBackBuffer, , IsFrontBufferAvailable false
SetBackBuffer . ,
SetBackBuffer, IntPtr.Zero.

D3DImage
!
, WPF .
( , WPF
, .) ,
, D3DImage SetBackBuffer Add
DirtyRect, DirectX
IDirect3DSurface9. ,
D3DImage.Lock, , WPF
, D3DImage.TryLock,
-.
D3DImage.Unlock, !

WPF !
DirectX WPF
( ), Present
Direct3D. , WPF
,
, SetBackBuffer.
,
.

DirectX WPF

787

, CompositionTarget_Rendering
Render ( D3DImage ),
D3DImage, AddDirtyRect,
D3DImage. WPF D3DImage
, .
,
. , ,
DirectX D3DImage
.


, DirectX D3DImage
, , ,
DirectX API (
C++ DirectXSample.dll). ,
.
DirectX 9 ,
D3DImage.SetBackBuffer
D3DResourceType IDirect3DSurface9! (
Direct3D IDirect3DDevice9Ex.)
Windows XP Direct3DCreate9,
IDirect3DDevice9.
D3DPOOL_DEFAULT, D3DUSAGE_RENDERTARGET D3DFMT_X8R8G8B8 (RGB)
D3DFMT_A8R8G8B8 (ARGB). Windows Vista
Direct3DCreate9Ex ( IDirect3DDevice9Ex)
,
Windows Display Driver Model (WDDM),
.
Windows XP (
), Direct3D ,
Windows Vista
. ,
WPF DirectX!

D3DImage !
WPF (-
,
), , D3DImage,
. D3DImage Render
TargetBitmap.
,
.

788

19.


ActiveX WPF-
ActiveX,
WPF-. WPF
. Windows Forms 1.0
,
ActiveX. WPF,
, Windows Forms. WPF
, Windows
Forms.
Windows Forms Acti
veX WPF , ,
. ,
ActiveX WPF-, Microsoft
Terminal Services, Windows.
,
API.
ActiveX,
, Windows Forms
. :
ActiveX DLL ActiveX Importer (AXIMP.EXE).
Windows SDK, .NET Framework.
Windows Forms Visual Studio,
. COM Components
( COM) ,
ToolsChoose Toolbox Items (
).
. Visual Studio ActiveX Importer.
DLL-.
WPF ( System.Windows.
Forms.dll WindowsFormsIntegration.dll).
,
, , ,
, ActiveX DLL.
Windows Forms, Ac
tiveX. ,
, Ax.
Microsoft Terminal Services
ActiveX DLL mstscax.dll system32
Windows. ( Choose Toolbox Items
Microsoft Terminal Services Client Control.) ActiveX Importer
MSTSCLib.dll AxMSTSCLib.dll.

ActiveX WPF-

789

(MSTSCLib.dll, AxMSTSCLib.dll, System.


Windows.Forms.dll WindowsFormsIntegration.dll) ,
, 19.12 19.13;
XAML C#, .
.19.12.
19.12. Window1.xaml XAML- WPF-,
Terminal Services
<Window x:Class="HostingActiveX.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Hosting the Terminal Services ActiveX Control">
<DockPanel Name="panel" Margin="10">
<StackPanel Margin="0,0,0,10" DockPanel.Dock="Top" Orientation="Horizontal">
<TextBox x:Name="serverBox" Width="180" Margin="0,0,10,0"/>
<Button x:Name="connectButton" Click="connectButton_Click">Connect</Button>
</StackPanel>
</DockPanel>
</Window>

.19.12. ActiveX Terminal Services ActiveX


WPF-

19.13. Window1.xaml.cs C#
ActiveX Terminal Services
using System;
using System.Windows;
using System.Windows.Forms.Integration;

790

19.

namespace HostingActiveX
{
public partial class Window1 : Window
{
AxMSTSCLib.AxMsTscAxNotSafeForScripting termServ;
public Window1()
{
InitializeComponent();
// ActiveX
WindowsFormsHost host = new WindowsFormsHost();
termServ = new AxMSTSCLib.AxMsTscAxNotSafeForScripting();
// ActiveX ,
// WPF
host.Child = termServ;
panel.Children.Add(host);
}
void connectButton_Click(object sender, RoutedEventArgs e)
{
termServ.Server = serverBox.Text;
termServ.Connect();
}
}
}

XAML- 19.12 ;
DockPanel, TextBox Button
. 19.13 DockPanel
WindowsFormsHost, , ActiveX Win
dows Forms, WindowsFormsHost.
AxMsTscAxNotSafeForScripting. ( Windows Vista
AxMsTscAx.) , ,
. Server
, , ,
Connect.
, WindowsFormsHost AxMsTscAxNotSafeForScripting
XAML,
19.13 . XAML-
19.14. ,
, connectButton_Click,
Connect.
19.14. Window1.xaml XAML-
WPF-, Terminal Services
<Window x:Class="HostingActiveX.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

ActiveX WPF-

791

xmlns:ax="clr-namespace:AxMSTSCLib;assembly=AxMSTSCLib"
Title="Hosting the Terminal Services ActiveX Control">
<DockPanel Name="panel" Margin="10">
<StackPanel Margin="0,0,0,10" DockPanel.Dock="Top" Orientation="Horizontal">
<TextBox x:Name="serverBox" Margin="0,0,10,0"/>
<Button x:Name="connectButton" Click="connectButton_Click">Connect</Button>
</StackPanel>
<WindowsFormsHost>
<ax:AxMsTscAxNotSafeForScripting x:Name="termServ"/>
</WindowsFormsHost>
</DockPanel>
</Window>

ActiveX XBAP-
XAML-,
Windows Forms (
).
Frame WebBrowser, -,
ActiveX. :
<Frame Source="pack://siteoforigin:,,,/webpage.html"/>

webpage.html :
<html>
<body>
<object Width="100%" Height="100%" ClassId="clsid:..."/>
</body>
</html>

,
webpage.html Internet Explorer. ,
, ,
.
, ActiveX .

FAQ
WPF
ActiveX?
HWND
,
( ,
ActiveTemplate Library ATL) WPF-.

792

19.

, WPF
.
HWND, Windows Forms, DirectX ActiveX
.
, ,
.
, ,
.
.
, . 19.1 ,
, , .
19.1.

HwndHost

HWND WPF

WindowsFormsHost

Windows Forms WPF

D3DImage

DirectX WPF HWND

HwndSource

WPF HWND

ElementHost

WPF Windows Forms

,
.
WPF,
.
, C++/CLI, PInvoke
COM.
, ,
WPF
. , WPF-

. .
. ,
,
, . WPF-
(
, )
Silverlight.
,
, WPF,
. , -
MFC , .

793

MFC (,
GDI) . WPF
,
15 , WPF-
. WPF
,
: ,
..
, , WPF,
, ,
, , ,
WPF.
, ,

: WPF ,

WPF, .
(
WPF ) .

20.

20

9 ,
,
,
. ,
,
,
.
, -

. :
( ) (,
).
WPF
, .
. WPF
,
. 14 , , ,

.
.
, , ,
,
, WPF ! ( ,
.
.)
, ,
, API, .

795


, ,
.
, !

FAQ
, .
?
,
,
. ,
( WPF).
,
,
. , , ,
,
, ,
( , 14).
Visual
Studio. Visual Studio
,
. , XAML-
,
, Window Page.
.cs ( .vb)
, (themes\generic.
xaml).
, ,

. Control
. , ,
UserControl, ContentControl,
Control. ,
,
Control ,
.
, ,
, - , Content
Control (, RangeBase Selector) , , Content
Control (, HeaderedContentControl Button),
.
ContentControl ,
Control, Control.
, .

796

20.

, Content
Control ( ) UserControl ( )
, . ,
UserControl Content
Control; ,
Stretch ( Left Top), IsTabStop Focusable
false, ,
, UserControl. , , .
WPF UserControl .
, (
) (
).



,
, . File
InputBox, TextBox Browse ().
,
TextBox, ,
OpenFileDialog.
, TextBox.
, , <INPUT TYPE="FILE"/> HTML.



20.1 XAML-,
, .20.1
.
20.1. FileInputBox.xaml
FileInputBox
<UserControl x:Class="Chapter20.FileInputBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DockPanel>
<Button x:Name="theButton" DockPanel.Dock="Right" Click="theButton_Click">
Browse...</Button>
<TextBox x:Name="theTextBox"
MinWidth="{Binding ActualWidth, ElementName=theButton}" Margin="0,0,2,0"/>
</DockPanel>
</UserControl>

797

.20.1. FileInputBox
TextBox Button

Button ,
Click ( ).
TextBox ,
, . XAML- ,
.
MinWidth TextBox , ,
.
(
),
.
.20.2 , ,
FileInputBox,
ContentControl Control:
<local:FileInputBox BorderBrush="Orange" BorderThickness="4" Background="Blue"
HorizontalContentAlignment="Right"/>

.20.2. FileInputBox
,

, , ,
,
. FileInputBox ,
UserControl. ,
UserControl , .20.2,
:
<ControlTemplate TargetType="{x:Type UserControl}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}">
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</ControlTemplate>

798

20.

FileInputBox ContentControl
( UserControl), ,
FileInputBox .
FileInputBox ,
(TextBox, Button DockPanel)
.

,
, ,
Style ( null,
).

FileInputBox:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Chapter20">
<StackPanel Margin="20">
<local:FileInputBox/>
</StackPanel>
</Window>

,
FileInputBox.xaml, :
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Chapter20">
<StackPanel Margin="20">
<UserControl>
<DockPanel>
<Button DockPanel.Dock="Right">Browse...</Button>
<TextBox MinWidth="{Binding ActualWidth, ElementName=theButton}"
Margin="0,0,2,0"/>
</DockPanel>
</UserControl>
</StackPanel>
</Window>

,
,
DockPanel, Button TextBox (
).
, ,
.

799



20.2
20.1. FileInputBox
, , TextBox
, , FileName
Changed, TextChanged TextBox.
TextChanged (
) FileNameChanged.
20.2. FileInputBox.xaml.cs FileInputBox
using
using
using
using

System;
System.Windows;
System.Windows.Controls;
Microsoft.Win32;

namespace Chapter20
{
public partial class FileInputBox : UserControl
{
public FileInputBox()
{
InitializeComponent();
theTextBox.TextChanged += new TextChangedEventHandler(OnTextChanged);
}
private void theButton_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog d = new OpenFileDialog();
if (d.ShowDialog() == true) // true, false null
this.FileName = d.FileName;
}
public string FileName
{
get { return theTextBox.Text; }
set { theTextBox.Text = value; }
}
void OnTextChanged(object sender, TextChangedEventArgs e)
{
e.Handled = true;
if (FileNameChanged != null)
FileNameChanged(this, EventArgs.Empty);
}
public event EventHandler<EventArgs> FileNameChanged;
}
}

800

20.

!

WPF, ,
.NET, . .20.3
.

.20.3. FileInputBox
OpenFileDialog

.
Window Page, ,
, Chapter20:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Chapter20">
<StackPanel Margin="20">
<local:FileInputBox/>
</StackPanel>
</Window>

,
clr-namespace ,
:
xmlns:local="clr-namespace:Chapter20;assembly=Chapter20Controls"

801

FileInputBox,
TextBox FileName,
c:\Lindsay.htm:
<local:FileInputBox FileName="c:\Lindsay.htm"/>

FileInputBox ContentControl,
:
<local:FileInputBox Content="c:\Lindsay.htm"/>

<local:FileInputBox>c:\Lindsay.htm</local:FileInputBox>

, ?
Content ( DockPanel, Button
TextBox) ! , ,
, Text
Block!
, . FileInputBox
Content, FileName:
[ContentProperty("FileName")]
public partial class FileInputBox : UserControl
{
...
}


<local:FileInputBox>c:\Lindsay.htm</local:FileInputBox>

:
<local:FileInputBox FileName="c:\Lindsay.htm"/>

Con
tent? FileInputBox :
protected override void OnContentChanged(object oldContent, object newContent)
{
if (oldContent != null)
throw new InvalidOperationException("You can't change Content!");
}


( Content) TextBox.Text
Content. ,
!

802

20.



FileInputBox , FileName
.NET .
,
..
FileName ,
DependencyProperty,
FileName, :
public static readonly DependencyProperty FileNameProperty =
DependencyProperty.Register("FileName", typeof(string), typeof(FileInputBox));
public string FileName
{
get { return (string)GetValue(FileNameProperty); }
set { SetValue(FileNameProperty, value); }
}

WPF Proper
tyNameProperty.
.
FileName
. Text
TextBox! FileName Text,
OnTextChanged:
void OnTextChanged(object sender, TextChangedEventArgs e)
{
this.FileName = theTextBox.Text;
e.Handled = true;
if (FileNameChanged != null)
FileNameChanged(this, EventArgs.Empty);
}

Text FileName,
FileName :
set { theTextBox.Text = value; SetValue(FileNameProperty, value); }

, , 3
WPF, , , , .NET .
XAML-, .., WPF
SetValue .
File
Name, ,
. Text File

803

Name . 20.3
FileInputBox, , FileName
. , XAML- FileInput
Box :
<UserControl x:Class="Chapter20.FileInputBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="root">
<DockPanel>
<Button x:Name="theButton" DockPanel.Dock="Right" Click="theButton_Click">
Browse...</Button>
<TextBox x:Name="theTextBox"
MinWidth="{Binding ActualWidth, ElementName=theButton}"
Text="{Binding FileName, ElementName=root}" Margin="0,0,2,0"/>
</DockPanel>
</UserControl>

20.3. FileInputBox.xaml.cs
20.2, FileName
using
using
using
using

System;
System.Windows;
System.Windows.Controls;
Microsoft.Win32;

namespace Chapter20
{
public partial class FileInputBox : UserControl
{
public FileInputBox()
{
InitializeComponent();
theTextBox.TextChanged += new TextChangedEventHandler(OnTextChanged);
}
private void theButton_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog d = new OpenFileDialog();
if (d.ShowDialog() == true) // true, false null
this.FileName = d.FileName;
}
public string FileName
{
get { return (string)GetValue(FileNameProperty); }
set { SetValue(FileNameProperty, value); }
}
private void OnTextChanged(object sender, TextChangedEventArgs e)
{

804

20.

e.Handled = true;
if (FileNameChanged != null)
FileNameChanged(this, EventArgs.Empty);
}
public static readonly DependencyProperty FileNameProperty =
DependencyProperty.Register("FileName", typeof(string), typeof(FileInputBox));
public event EventHandler<EventArgs> FileNameChanged;
}
}

TextBox.Text (
),
, ,
FileName TextBox.


, GetValue SetValue!
, ,
.
SetValue,

. -
, , , , 20.3.

FrameworkPropertyMetadata, DependencyProperty.
Register,
. ,
, , ,

, ,
, ..



,
, , ,
.
,

805

, .NET .
FileInputBox FileNameChanged
, TextChanged
!
6 : , ,
,
, . RoutedEvent
( Event),
.NET,
AddHandler RemoveHandler. 20.4 ,
FileNameChanged
. ,
OnTextChanged
RaiseEvent, UIElement.
20.4. FileInputBox.xaml.cs 20.3,
FileNameChanged
using
using
using
using

System;
System.Windows;
System.Windows.Controls;
Microsoft.Win32;

namespace Chapter20
{
public partial class FileInputBox : UserControl
{
public FileInputBox()
{
InitializeComponent();
theTextBox.TextChanged += new TextChangedEventHandler(OnTextChanged);
}
private void theButton_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog d = new OpenFileDialog();
if (d.ShowDialog() == true) // true, false null
this.FileName = d.FileName;
}
public string FileName
{
get { return (string)GetValue(FileNameProperty); }
set { SetValue(FileNameProperty, value); }
}
private void OnTextChanged(object sender, TextChangedEventArgs e)
{
e.Handled = true;
RoutedEventArgs args = new RoutedEventArgs(FileNameChangedEvent);

806

20.

RaiseEvent(args);
}
public event RoutedEventHandler FileNameChanged
{
add { AddHandler(FileNameChangedEvent, value); }
remove { RemoveHandler(FileNameChangedEvent, value); }
}
public static readonly DependencyProperty FileNameProperty =
DependencyProperty.Register("FileName", typeof(string), typeof(FileInputBox));
public static readonly RoutedEvent FileNameChangedEvent =
EventManager.RegisterRoutedEvent("FileNameChanged",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(FileInputBox));
}
}



FileInputBox,
PlayingCard ( ).
,
,

.



PlayingCard ,
52 . .
,
.
,
WPF.
, -
, Control,
.
PlayingCard Foreground,
. Foreground Brush,
"H2" (
) "SQ" ( ). -
string (, TextBlock.Text), 14,
.
Face.

807

, ,
Button.
? ToggleButton
IsChecked, ! ToggleButton
.


20.5 PlayingCard,
ToggleButton.
20.5. PlayingCard.cs
PlayingCard
using System.Windows.Media;
using System.Windows.Controls.Primitives;
namespace Chapter20
{
public class PlayingCard : ToggleButton
{
public string Face
{
get { return face; }
set { face = value; Foreground = (Brush)TryFindResource(face); }
}
private string face;
}
}

Click, Checked Unchecked, IsChecked


ToggleButton, PlayingCard
Face. 20.5
, Foreground .
TryFindResource,
Foreground null .
, - "HA", "H2", "H3"
.. Resources
PlayingCard, TryFindResource .
52
Adobe Illustrator ,
XAML , http://mikes
wanson.com/xamlexport. 52 DrawingBrush
GeometryDrawing.
Resources PlayingCard.
XAML- C#,
PlayingCard : XAML C#,
20.5 . 20.6 20.7 ,
.

808

20.

20.6. PlayingCard.xaml.cs 20.5



using System.Windows.Media;
using System.Windows.Controls.Primitives;
namespace Chapter20
{
public partial class PlayingCard : ToggleButton
{
public PlayingCard()
{
InitializeComponent();
}
public string Face
{
get { return face; }
set { face = value; Foreground = (Brush)TryFindResource(face); }
}
private string face;
}
}

20.7. PlayingCard.xaml
PlayingCard
<ToggleButton x:Class="Chapter20.PlayingCard"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Chapter20">
<ToggleButton.Resources>
<DrawingBrush x:Key="HA" Stretch="Uniform">
<DrawingBrush.Drawing>
...
</DrawingBrush.Drawing>
</DrawingBrush>
<DrawingBrush x:Key="H2" Stretch="Uniform">
<DrawingBrush.Drawing>
...
</DrawingBrush.Drawing>
</DrawingBrush>
...
<Style TargetType="{x:Type local:PlayingCard}">
...
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:PlayingCard}">
...
<Rectangle Fill="{TemplateBinding Foreground}"/>
...

809

</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Resources>
</ToggleButton>

C# ,
, .
20.7 Resources 52 DrawingBrush
,
( , ). ,
Checked, Unchecked, MouseEnter MouseLeave
( ).
, ToggleButton Checked
Unchecked CheckStates
Normal MouseOver CommonStates ButtonBase.
, Rectangle
Foreground, Face
DrawingBrush. 20.7
100 ( !) - Draw
ingBrush. , , , http://informit.
com/title/9780672331190 .
.20.4 PlayingCard,
Window,
Face,
.
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Chapter20"
Title="Window Hosting PlayingCards">
<Window.Background>
...
</Window.Background>
<Viewbox>
<Canvas Width="220" Height="400">
<local:PlayingCard Face="C3" Width="100" Height="140"
Canvas.Left="0" Canvas.Top="100">
<local:PlayingCard.RenderTransform>
<RotateTransform CenterX="50" CenterY="140" Angle="300"/>
</local:PlayingCard.RenderTransform>
</local:PlayingCard>
<local:PlayingCard Face="CQ" Width="100" Height="140"
Canvas.Left="10" Canvas.Top="100">
<local:PlayingCard.RenderTransform>
<RotateTransform CenterX="50" CenterY="140" Angle="310"/>
</local:PlayingCard.RenderTransform>
</local:PlayingCard>

810

20.

...
</Canvas>
</Viewbox>
</Window>

.20.4. ,

PlayingCard ,
. ,
, .
.
. , 52 DrawingBrush
,
! (100 13 =
!)
, .
, Window

811

Resources PlayingCard,
, ResourceDictionary
.
,
. , 20.5 20.6,
PlayingCard,
,
, Foreground.
,
PlayingCard.Resources Application.Resources,
. ,
.
, , .20.5.

.20.5. ,
ToggleButton

, PlayingCard,
,
.
.


20.5,
Foreground, ,
PlayingCard:

812

20.

public string Face


{
get { return face; }
set { face = value; Foreground = (Brush)TryFindResource(face); }
}

PlayingCard (themes\
generic.xaml, . 14). ,
PlayingCard ( , .20.5)
PlayingCard :
DefaultStyleKeyProperty.OverrideMetadata(typeof(PlayingCard),
new FrameworkPropertyMetadata(typeof(PlayingCard)));

Face
WPF, .
20.8 ,
PlayingCard.
20.8. PlayingCard.cs
PlayingCard
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls.Primitives;
namespace Chapter20
{
public class PlayingCard : ToggleButton
{
static PlayingCard()
{
//
DefaultStyleKeyProperty.OverrideMetadata(typeof(PlayingCard),
new FrameworkPropertyMetadata(typeof(PlayingCard)));
// Face
FaceProperty = DependencyProperty.Register("Face",
typeof(string), typeof(PlayingCard));
}
public string Face
{
get { return (string)GetValue(FaceProperty); }
set { SetValue(FaceProperty, value); }
}
public static DependencyProperty FaceProperty;
}
}

- ,
. :

813

ToggleButton Face.
.

WPF Custom Control Library Visual Studio


Add () New Item ( )
Visual Studio
, Default
StyleKeyProperty.OverrideMetadata (
, ). XAML-
.
,
PlayingCard.



,
.
( ,
, .)
, .20.4,
, PlayingCard (. 20.7),
.

20.7:
<Rectangle Fill="{TemplateBinding Foreground}"/>

Rectangle
Foreground , PlayingCard
,
.
Fill DrawingBrush
, Face.
,
,
. Face , , ,
Fill :
<Rectangle>
<Rectangle.Fill>
<StaticResource ResourceKey="{TemplateBinding Face}"/>
</Rectangle.Fill>
</Rectangle>

814

20.

, :
Cannot convert the value in attribute 'ResourceKey' to object of type ''.

TemplateBinding Binding:
<Rectangle>
<Rectangle.Fill>
<StaticResource ResourceKey=
"{Binding Face, RelativeSource={RelativeSource TemplatedParent}}"/>
</Rectangle.Fill>
</Rectangle>

, :
'Binding' cannot be set on the 'ResourceKey' property of type
'StaticResourceExtension'. A'Binding' can only be set on a DependencyProperty
of a DependencyObject.

ResourceKey ( ,
StaticResourceExtension DependencyObject),

.
DrawingBrush Compo
nentResourceKey ( TypeInTargetAssembly PlayingCard, Re
sourceId ), , ,
Foreground TryFindReso
urce, TemplateBinding Foreground. (
ComponentResourceKey , FindResource
TryFindResource
.) , , , ,
20.8, :
52 ( Face)
Fill , . , .
20.9 13 52 .
20.9. Generic.xaml ,
PlayingCard
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Chapter20">
...
<Style TargetType="{x:Type local:PlayingCard}">
...
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:PlayingCard}">
...
<Rectangle Name="faceRect"/>
...


<ControlTemplate.Triggers>
<Trigger Property="Face" Value="HA">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource HA}"/>
</Trigger>
<Trigger Property="Face" Value="H2">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H2}"/>
</Trigger>
<Trigger Property="Face" Value="H3">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H3}"/>
</Trigger>
<Trigger Property="Face" Value="H4">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H4}"/>
</Trigger>
<Trigger Property="Face" Value="H5">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H5}"/>
</Trigger>
<Trigger Property="Face" Value="H6">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H6}"/>
</Trigger>
<Trigger Property="Face" Value="H7">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H7}"/>
</Trigger>
<Trigger Property="Face" Value="H8">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H8}"/>
</Trigger>
<Trigger Property="Face" Value="H9">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H9}"/>
</Trigger>
<Trigger Property="Face" Value="H10">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource H10}"/>
</Trigger>
<Trigger Property="Face" Value="HJ">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource HJ}"/>
</Trigger>
<Trigger Property="Face" Value="HQ">
<Setter TargetName="faceRect" Property="Fill"
Value="{StaticResource HQ}"/>
</Trigger>
<Trigger Property="Face" Value="HK">

815

816

20.

<Setter TargetName="faceRect" Property="Fill"


Value="{StaticResource HK}"/>
</Trigger>
...
</ControlTemplate.Triggers>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

, Face ,
, Face 0
51; .
Suit () Rank (),
.
,
,
PlayingCard. ( , -
,
x:Shared="False".)

PlayingCard. ,
, ,
TextBlock.
, PlayingCard,
, 52
, ComponentResourceKey,
.


PlayingCard
Play
ingCard, PlayingCard ListBox
. Selec
tionMode .
ListBox, , .20.4
20.5, .
ListBox ItemsPanel.
, FanCanvas.
PlayingCard ,
,
. ,
, !

817


,
.
WPF ,
.
, PlayingCard,
. ,

System.Windows.Controls.Primitives, BulletDecorator, Resize
Grip, ScrollBar, Thumb, Track .



PlayingCard ,

. .
, ,
FileInputBox, , .
( XAML- )
:
<DockPanel>
<Button x:Name="theButton" DockPanel.Dock="Right" Click="theButton_Click">
Browse...</Button>
<TextBox x:Name="theTextBox"
MinWidth="{Binding ActualWidth, ElementName=theButton}"
Text="{Binding FileName, ElementName=root}" Margin="0,0,2,0"/>
</DockPanel>

theButton_
Click FileInputBox? Click
. (, ,
theButton_Click . ,
, , , ,
,
!)
,
WPF
:


PlayingCard
.

818

20.


14 ,
.
,
, .
, ,
. PART_XXX, XXX
.
, TemplatePartAttribute (
). File
InputBox, , Browse (),
:
[TemplatePart(Name="PART_Browse", Type=typeof(Button))]
public class FileInputBox : Control
{
...
}

WPF TemplatePartAttribute,
, .
,
OnApplyTemplate, Fra
meworkElement. ,

.
GetTemplateChild, Framework
Element. Browse
Click:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
// Button
Button browseButton = base.GetTemplateChild("PART_Browse") as Button;
//
if (browseButton != null)
browseButton.Click += new RoutedEventHandler(theButton_Click);
}

, ,
PART_Browse, , , browseButton null.
, ,
. , -
FileInputBox, Browse
.
, OnApply

819

Template , .
,
Expression Blend.


. FileInputBox,
,
:
<Button Command="{x:Static local:FileInputBox.BrowseCommand}">Browse...</Button>

, ,
, Button!
FileInputBox
.NET RoutedCommand RoutedUICommand (
,
):
private static RoutedUICommand browseCommand = new
RoutedUICommand("Browse...", "BrowseCommand", typeof(FileInputBox));
public static RoutedUICommand BrowseCommand
{
get { return browseCommand; }
}

(
theButton_Click) :
static FileInputBox()
{
// ,
CommandManager.RegisterClassInputBinding(typeof(FileInputBox),
new MouseGesture(MouseAction.LeftClick));
// :
CommandManager.RegisterClassCommandBinding(typeof(FileInputBox),
new CommandBinding(browseCommand, theButton_Click));
}


14 , WPF4
,
, Expression Blend. ,
. , Control,
ValidationStates: Valid, InvalidFocused
InvalidUnfocused. PlayingCard
CheckStates ( Checked, Unchecked Indeterminate)

820

20.

ToggleButton CommonStates (
Normal, MouseOver, Pressed Disabled)
ButtonBase.
, PlayingCard,
. ,
.
,
,
.
Front ( )
Back ( ) FlipStates.
( , .)
,
PlayingCard TemplateVisualState:
[TemplateVisualState(Name="Front", GroupName="FlipStates")]
[TemplateVisualState(Name="Back", GroupName="FlipStates")]
public class PlayingCard : ToggleButton
{
...
}

,
,
GoToState VisualStateManager.
- , :
internal void ChangeState(bool useTransitions)
{
// , IsShowingFace , :
if (this.IsShowingFace)
VisualStateManager.GoToState(this, "Front", useTransitions);
else
VisualStateManager.GoToState(this, "Back", useTransitions);
}

,
!
.
,
.
, ,

- .

821

,
!
,
.
, ,
, , GoToState VisualStateManager
.
,
.
-
. , CalendarDayButton Normal (
CommonStates), NormalDay ( BlackoutDayStates), RegularDay (
DayStates), Unfocused ( FocusStates), CalendarButtonUnfocused (
CalendarButtonFocusStates) . Default Normal.

:
OnApplyTemplate ( useTransitions=false)
( useTran
sitions=
false)
(,
PropertyChanged IsShowingFace)
, GoToState,
( ).
ChangeState, ,
, ,
.


!
, ( )
, , .

. , ,
,
, .
, false
useTransitions GoToState, .

822

20.

Control , ,
, :
internal virtual void ChangeVisualState(bool useTransitions)
{
// ValidationStates:
if (Validation.GetHasError(this))
{
if (this.IsKeyboardFocused)
VisualStateManager.GoToState(this, "InvalidFocused", useTransitions);
else
VisualStateManager.GoToState(this, "InvalidUnfocused", useTransitions);
}
else
{
VisualStateManager.GoToState(this, "Valid", useTransitions);
}
}

ChangeVisualState ,
WPF . , ButtonBase
:
internal override void ChangeVisualState(bool useTransitions)
{
// ValidationStates:
base.ChangeVisualState(useTransitions);
// CommonStates:
if (!this.IsEnabled)
VisualStateManager.GoToState(this, "Disabled", useTransitions);
else if (this.IsPressed)
VisualStateManager.GoToState(this, "Pressed", useTransitions);
else if (this.IsMouseOver)
VisualStateManager.GoToState(this, "MouseOver", useTransitions);
else
VisualStateManager.GoToState(this, "Normal", useTransitions);
// FocusStates:
if (this.IsKeyboardFocused)
VisualStateManager.GoToState(this, "Focused", useTransitions);
else
VisualStateManager.GoToState(this, "Unfocused", useTransitions);
}

ToggleButton :
internal override void ChangeVisualState(bool useTransitions)
{
// ValidationStates, CommonStates FocusStates:
base.ChangeVisualState(useTransitions);

823

// CheckStates:
if (this.IsChecked == true)
VisualStateManager.GoToState(this, "Checked", useTransitions);
else if (this.IsChecked == false)
VisualStateManager.GoToState(this, "Unchecked", useTransitions);
else // this.isChecked == null
{
// Indeterminate.
// , Unchecked
if (!VisualStateManager.GoToState(this, "Indeterminate", useTransitions))
VisualStateManager.GoToState(this, "Unchecked", useTransitions);
}
}

GoToState false,
. , ,
VisualState.
,
, GoToState. ToggleButton
Unchecked, Indeterminate . (
, IsChecked ; Toggle
Button - ,
, .)
PlayingCard ChangeVisualState
ToggleButton ( WPF),
, ToggleButton.
ChangeState PlayingCard
ChangeVisualState,
.



,
. , FrameworkElementAutomationPeer,
ControlNameAutomationPeer
.
OnCreateAutomationPeer ( UIElement) ,
-:
protected override AutomationPeer OnCreateAutomationPeer()
{
return new FileInputBoxAutomationPeer(this);
}

824

20.

, ,
-
, :
FileInputBoxAutomationPeer peer =
UIElementAutomationPeer.FromElement(myControl) as FileInputBoxAutomationPeer;
if (peer != null)
peer.RaiseAutomationEvent(AutomationEvents.StructureChanged);

,
(,
Visual Studio Expression Blend). System.ComponentModel.
DesignerProperties IsInDesignMode,
.
,
, GetIsInDesignMode
.

, WPF ,
-
. , WPF,
Visual Studio .
,
,
Windows Forms,
! WPF
.
,
WPF . ,
,
FrameworkElement. , Panel,
.
() .

SimpleCanvas
SimpleStackPanel
OverlapPanel
FanCanvas

21



21.

5
, WPF.
, . ,
, ,
(. 4 ,
),
, , -
. ,
; (
)
Canvas. ,
.
, WrapPanel,
( )
, . StackPanel,
,
DockPanel, Bottom
Dock.
, Virtu
alizingWrapPanel VirtualizingStackPanel.
,
, ToolBarTray.

,
,
- .

826

21.

. ,
, ,
, WPF,
,
.
, ,
, WPF
.
.
; ,
. ,
;
4 5 .

4 5 ,
.
,
. ,
.


,
, . (
, ) ,
MeasureOverride, FrameworkElement.
:
protected override Size MeasureOverride(Size availableSize)
{
...
//
//
foreach (UIElement child in this.Children)
{
child.Measure(new Size(...));
// child.DesiredSize
...
}
...
// , ,
// availableSize
return new Size(...);
}

827

Children (
UIElementCollection),
, Measure (
UIElement). ,
DesiredSize .
,
.

MeasureOverride Measure
!
, ,
DesiredSize ,
.
( Measure),
, Measure .
: ? - ,
. ( , .
!)

C#, Measure
Override, Size,
.

Size, Measure
,
. ,
( availableSize), -
,
.
Size
Double.PositiveInfinity. ,
. ,
: ,
?
child.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));

,
Margin (. 4), MeasureOverride
, Measure, .
, availableSize,
MeasureOverride, .

828

21.

Size, MeasureOverride
Size
( ,
). , , ,
. ,
, ,
,
, .

availableSize,
MeasureOverride!
- , ,
availableSize,
MeasureOverride. , : ,
.
availableSize
(Double.PositiveInfinity), DesiredSize .
,
. - ,
Measure UIElement InvalidOpera
tionException : "Layout measurement override
of element 'XXX' should not return PositiveInfinity as its DesiredSize, even if In
finity is passed in as available size" (
'XXX' PositiveInfinity De
siredSize, Infinity).

,
DesiredSize .
,

, .



, .
,
( Size,
MeasureOverride). (
, )
ArrangeOverride, FrameworkElement. :

829

protected override Size ArrangeOverride(Size finalSize)


{
...
// ,
foreach (UIElement child in this.Children)
{
child.Arrange(new Rect(...));
// child.ActualHeight
// child.ActualWidth
...
}
...
// (ActualHeight ActualWidth)
return new Size(...);
}

,
Arrange ( UIElement) Rect Size.
,
, DesiredSize
. ,
.
, Measure, Arrange
( finalSize ).
, , , ,
. , ( -
). , ,
ActualHeight ActualWidth Arrange.
, ArrangeOverride,
RenderSize ActualHeight/ActualWidth .
, , MeasureOverride,
, finalSize,
,
.
, , , Margin,
, ,
( finalSize), .
, .
(,
DesiredSize Arrange), ,
, . ,
, HorizontalAlignment VerticalAlignment .

830

21.

MeasureOverride ArrangeOverride ,
!
MeasureOverride ArrangeOverride
,
( LayoutTransform RenderTransform). ,
- ,
!
,
UIElement.InvalidateMeasure UIElement.InvalidateArrange.
, , , - .
WPF, ,

FrameworkPropertyMetadataOptions: AffectsMeasure, AffectsArrange, AffectsPa
rentArrange, AffectsParentMeasure.
, , ,
, ,
, Dispatcher.BeginInvoke
.
DispatcherPriority, Loaded.

SimpleCanvas
,
.
Canvas, SimpleCanvas. SimpleCanvas
, Canvas, Left, Top, Right Bottom,
, Left Top.
, ,
Right Bottom Left Top. (
SimpleCanvas , Canvas,
,
Left Top.)
SimpleCanvas ( )
:
1. , Panel.
2. , ,
.
3. MeasureOverride
.
4. ArrangeOverride
.
21.1 SimpleCanvas.

SimpleCanvas

831

21.1. SimpleCanvas.cs SimpleCanvas


using
using
using
using
using

System;
System.ComponentModel;
System.Windows;
System.Windows.Controls;
System.Windows.Media;

namespace CustomPanels
{
public class SimpleCanvas : Panel
{
public static readonly DependencyProperty LeftProperty =
DependencyProperty.RegisterAttached("Left", typeof(double),
typeof(SimpleCanvas), new FrameworkPropertyMetadata(Double.NaN,
FrameworkPropertyMetadataOptions.AffectsParentArrange));
public static readonly DependencyProperty TopProperty =
DependencyProperty.RegisterAttached("Top", typeof(double),
typeof(SimpleCanvas), new FrameworkPropertyMetadata(Double.NaN,
FrameworkPropertyMetadataOptions.AffectsParentArrange));
[TypeConverter(typeof(LengthConverter)),AttachedPropertyBrowsableForChildren]
public static double GetLeft(UIElement element)
{
if (element == null) { throw new ArgumentNullException("element"); }
return (double)element.GetValue(LeftProperty);
}
[TypeConverter(typeof(LengthConverter)),AttachedPropertyBrowsableForChildren]
public static void SetLeft(UIElement element, double length)
{
if (element == null) { throw new ArgumentNullException("element"); }
element.SetValue(LeftProperty, length);
}
[TypeConverter(typeof(LengthConverter)),AttachedPropertyBrowsableForChildren]
public static double GetTop(UIElement element)
{
if (element == null) { throw new ArgumentNullException("element"); }
return (double)element.GetValue(TopProperty);
}
[TypeConverter(typeof(LengthConverter)),AttachedPropertyBrowsableForChildren]
public static void SetTop(UIElement element, double length)
{
if (element == null) { throw new ArgumentNullException("element"); }
element.SetValue(TopProperty, length);
}
protected override Size MeasureOverride(Size availableSize)
{

832

21.

foreach (UIElement child in this.Children)


{
// ,
if (child != null)
child.Measure(new Size(Double.PositiveInfinity,
Double.PositiveInfinity));
}
// SimpleCanvas
return new Size(0, 0);
}
protected override Size ArrangeOverride(Size finalSize)
{
foreach (UIElement child in this.Children)
{
if (child != null)
{
double x = 0;
double y = 0;
// Left Top , ,
// (0,0)
double left = GetLeft(child);
double top = GetTop(child);
if (!Double.IsNaN(left)) x = left;
if (!Double.IsNaN(top)) y = top;
// (x,y) DesiredSize
child.Arrange(new Rect(new Point(x, y), child.DesiredSize));
}
}
//
return finalSize;
}
}
}

Left Top,
DependencyProperty Get/
Set. Canvas, Left Top
Double.NaN, .
FrameworkPropertyMetadata Fra
meworkPropertyMetadataOptions.AffectsParentArrange, WPF ,
Simple
Canvas ,
.

SimpleCanvas

833

Get/Set
. LengthConverter,
XAML
, "Auto" ( Double.NaN)
("px", "in", "cm" "pt"). AttachedProperty
BrowsableForChildren ,
, .
MeasureOverride , ,
SimpleCanvas.
, ,
, , (
, ClipTo
Bounds true; FrameworkElement).
ArrangeOverride.
(0,0) DesiredSize,
Left Top. , Arrange
Override GetLeft GetTop ,
Double.NaN - .
, -
, (Height, MinHeight, MaxHeight, Width, Min
Width, MaxWidth, Margin, Padding, Visibility, HorizontalAlignment, VerticalAlignment,
LayoutTransform ).
.

.
, , ,
SimpleCanvas :
<Window x:Class="CustomPanels.SimpleCanvasWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomPanels"
Title="Four Buttons in a SimpleCanvas">
<local:SimpleCanvas>
<Button Content="1" Background="Red"/>
<Button local:SimpleCanvas.Left="40" local:SimpleCanvas.Top="40"
Content="2" Background="Orange"/>
<Button local:SimpleCanvas.Left="80" local:SimpleCanvas.Top="80"
Content="3" Background="Yellow"/>
<Button local:SimpleCanvas.Left="120" local:SimpleCanvas.Top="120"
Content="4" Background="Lime"/>
</local:SimpleCanvas>
</Window>

XAML- Window .NET CustomPanels


local,
local:.

834

21.

SimpleCanvas.cs ,
clr-namespace Assembly .
, SimpleCanvas
Canvas Left Top,
ArrangeOver
ride:
double left = Canvas.GetLeft(child);
double top = Canvas.GetTop(child);

:
<Window x:Class="CustomPanels.SimpleCanvasWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomPanels"
Title="Four Buttons in a SimpleCanvas">
<local:SimpleCanvas>
<Button Content="1" Background="Red"/>
<Button Canvas.Left="40" Canvas.Top="40"
Content="2" Background="Orange"/>
<Button Canvas.Left="80" Canvas.Top="80"
Content="3" Background="Yellow"/>
<Button Canvas.Left="120" Canvas.Top="120"
Content="4" Background="Lime"/>
</local:SimpleCanvas>
</Window>

,
, .

SimpleStackPanel
,
.
SimpleStackPanel, StackPanel.
,
. 21.2 .
21.2. SimpleStackPanel.cs SimpleStackPanel
using System;
using System.Windows;
using System.Windows.Controls;
namespace CustomPanels
{
public class SimpleStackPanel : Panel
{
//
public static readonly DependencyProperty OrientationProperty =

SimpleStackPanel

835

DependencyProperty.Register("Orientation", typeof(Orientation),
typeof(SimpleStackPanel), new FrameworkPropertyMetadata(
Orientation.Vertical, FrameworkPropertyMetadataOptions.AffectsMeasure));
public Orientation Orientation
{
get { return (Orientation)GetValue(OrientationProperty); }
set { SetValue(OrientationProperty, value); }
}
protected override Size MeasureOverride(Size availableSize)
{
Size desiredSize = new Size();
// ,
// .
if (Orientation == Orientation.Vertical)
availableSize.Height = Double.PositiveInfinity;
else
availableSize.Width = Double.PositiveInfinity;
foreach (UIElement child in this.Children)
{
if (child != null)
{
// ,
// ,
// , .
child.Measure(availableSize);
//
//
// .
if (Orientation == Orientation.Vertical)
{
desiredSize.Width = Math.Max(desiredSize.Width,
child.DesiredSize.Width);
desiredSize.Height += child.DesiredSize.Height;
}
else
{
desiredSize.Height = Math.Max(desiredSize.Height,
child.DesiredSize.Height);
desiredSize.Width += child.DesiredSize.Width;
}
}
}
return desiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{

836

21.

double offset = 0;
foreach (UIElement child in this.Children)
{
if (child != null)
{
if (Orientation == Orientation.Vertical)
{
// offset
// . ,
// , , .
child.Arrange(new Rect(0, offset, finalSize.Width,
child.DesiredSize.Height));
// offset
offset += child.DesiredSize.Height;
}
else
{
// offset
// . ,
// , , .
child.Arrange(new Rect(offset, 0, child.DesiredSize.Width,
finalSize.Height));
// offset
offset += child.DesiredSize.Width;
}
}
}
//
return finalSize;
}
}
}

21.1, Orien
tation. Vertical, FrameworkPropertyMetadata
Options ,
( , ,
).
MeasureOverride ,
, ,
(, );
.
, SimpleStackPanel
.
.
( ) .

OverlapPanel

837

ArrangeOverride offset ( , )
, .

, . SimpleStackPanel
, final
Size. ,
StackPanel.

OverlapPanel
OverlapPanel ,
. ,
SimpleStackPanel,
. SimpleStackPanel,
Orientation.
,
,
. , ,
SimpleStackPanel, ,
( Orientation) .
OverlapPanel ,
, , -
. . 21.1
Window, OverlapPanel:
<Window x:Class="CustomPanels.OverlapPanelWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomPanels"
Title="Four Buttons in an OverlapPanel">
<local:OverlapPanel>
<Button FontSize="40" Content="1" Background="Red"/>
<Button FontSize="40" Content="2" Background="Orange"/>
<Button FontSize="40" Content="3" Background="Yellow"/>
<Button FontSize="40" Content="4" Background="Lime"/>
</local:OverlapPanel>
</Window>

OverlapPanel Grid ( ),
*.
,
, ,

Canvas. Canvas,
. .21.1, ,
, ,

838

21.

, .21.2,
.
,

, ,

.21.1. OverlapPanel

.21.2. .21.1 Opacity=0.5,


, ,

21.3 OverlapPanel
, SimpleStackPanel,
21.2.

OverlapPanel

839

21.3. OverlapPanel.cs SimpleStackPanel,




using System;
using System.Windows;
using System.Windows.Controls;
namespace CustomPanels
{
public class OverlapPanel : Panel
{
double _totalChildrenSize = 0;
//
public static readonly DependencyProperty OrientationProperty =
DependencyProperty.Register("Orientation", typeof(Orientation),
typeof(OverlapPanel), new FrameworkPropertyMetadata(Orientation.Vertical,
FrameworkPropertyMetadataOptions.AffectsMeasure));
public Orientation Orientation
{
get { return (Orientation)GetValue(OrientationProperty); }
set { SetValue(OrientationProperty, value); }
}
protected override Size MeasureOverride(Size availableSize)
{
Size desiredSize = new Size();
foreach (UIElement child in this.Children)
{
if (child != null)
{
// , ,
//
child.Measure(availableSize);
//
//
// .
if (Orientation == Orientation.Vertical)
{
desiredSize.Width = Math.Max(desiredSize.Width,
child.DesiredSize.Width);
desiredSize.Height += child.DesiredSize.Height;
}
else
{
desiredSize.Height = Math.Max(desiredSize.Height,
child.DesiredSize.Height);
desiredSize.Width += child.DesiredSize.Width;

840

21.

}
}
}
_totalChildrenSize = (Orientation == Orientation.Vertical ?
desiredSize.Height : desiredSize.Width);
return desiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
double offset = 0;
double overlap = 0;
//
//
if (Orientation == Orientation.Vertical)
{
if (finalSize.Height > _totalChildrenSize)
// , _totalChildrenSize,
//
overlap = (_totalChildrenSize - finalSize.Height) / this.Children.Count;
else
// this.DesiredSize
overlap = (_totalChildrenSize - this.DesiredSize.Height) /
this.Children.Count;
}
else
{
if (finalSize.Width > _totalChildrenSize)
// , _totalChildrenSize,
//
overlap = (_totalChildrenSize - finalSize.Width) / this.Children.Count;
else
// this.DesiredSize
overlap = (_totalChildrenSize - this.DesiredSize.Width) /
this.Children.Count;
}
foreach (UIElement child in this.Children)
{
if (child != null)
{
if (Orientation == Orientation.Vertical)
{
// offset
// . ,
// , ,
// , .
child.Arrange(new Rect(0, offset, finalSize.Width,

OverlapPanel

841

child.DesiredSize.Height + (overlap > 0 ? 0 : -overlap)));


// offset
offset += (child.DesiredSize.Height - overlap);
}
else
{
// offset
// . ,
// , ,
// , .
child.Arrange(new Rect(offset, 0,
child.DesiredSize.Width + (overlap > 0 ? 0 : -overlap),
finalSize.Height));
// offset
offset += (child.DesiredSize.Width - overlap);
}
}
}
//
return finalSize;
}
}
}

MeasureOverride OverlapPanel
SimpleStackPanel ,
;
availableSize . ,
, .
,
(
).
_totalChildrenSize, ArrangeOverride.
ArrangeOverride
, overlap,
offset
. overlap ,
,
, ,
.
,
child.Arrange:
(overlap > 0 ? 0 : -overlap)

,
overlap, overlap . ,

842

21.

,
(. .21.1). , ,
.21.3.

.21.3. OverflowPanel,

, .21.1 ,
Button VerticalAlignment Stretch.
VerticalAlignment, Top,
OverlapPanel ,
.21.3. ;
, , ,
:
- .

FanCanvas
FanCanvas
.
.
. FanCanvas
10
ItemsPanel ListBox, .
21.4 FanCanvas.

FanCanvas

21.4. FanCanvas.cs FanCanvas


using
using
using
using

System;
System.Windows;
System.Windows.Controls;
System.Windows.Media;

namespace CustomPanels
{
public class FanCanvas : Panel
{
public static readonly DependencyProperty OrientationProperty =
DependencyProperty.Register("Orientation", typeof(Orientation),
typeof(FanCanvas), new FrameworkPropertyMetadata(Orientation.Horizontal,
FrameworkPropertyMetadataOptions.AffectsArrange));
public static readonly DependencyProperty SpacingProperty =
DependencyProperty.Register("Spacing", typeof(double),
typeof(FanCanvas), new FrameworkPropertyMetadata(10d,
FrameworkPropertyMetadataOptions.AffectsArrange));
public static readonly DependencyProperty AngleIncrementProperty =
DependencyProperty.Register("AngleIncrement", typeof(double),
typeof(FanCanvas), new FrameworkPropertyMetadata(10d,
FrameworkPropertyMetadataOptions.AffectsArrange));
public Orientation Orientation
{
get { return (Orientation)GetValue(OrientationProperty); }
set { SetValue(OrientationProperty, value); }
}
public double Spacing
{
get { return (double)GetValue(SpacingProperty); }
set { SetValue(SpacingProperty, value); }
}
public double AngleIncrement
{
get { return (double)GetValue(AngleIncrementProperty); }
set { SetValue(AngleIncrementProperty, value); }
}
protected override Size MeasureOverride(Size availableSize)
{
foreach (UIElement child in this.Children)
{
// ,
if (child != null)
child.Measure(new Size(Double.PositiveInfinity,
Double.PositiveInfinity));

843

844

21.

}
// FanCanvas , SimpleCanvas
return new Size(0, 0);
}
protected override Size ArrangeOverride(Size finalSize)
{
//
Point location = new Point(0,0);
double angle = GetStartingAngle();
foreach (UIElement child in this.Children)
{
if (child != null)
{
//
child.Arrange(new Rect(location, child.DesiredSize));
// : RenderTransform ,
//
child.RenderTransform = new RotateTransform(angle,
child.RenderSize.Width / 2, child.RenderSize.Height);
//
if (Orientation == Orientation.Vertical)
location.Y += Spacing;
else
location.X += Spacing;
angle += AngleIncrement;
}
}
//
return finalSize;
}
double GetStartingAngle()
{
double angle;
if (this.Children.Count % 2 != 0)
// , , 0
angle = -AngleIncrement * (this.Children.Count / 2);
else
// ,
// AngleIncrement 0
angle = -AngleIncrement * (this.Children.Count / 2) + AngleIncrement / 2;
// 90 ,

FanCanvas

845

if (Orientation == Orientation.Vertical)
angle += 90;
return angle;
}
}
}

FanCanvas - .
SimpleStackPanel OverflowPanel , ,
, . ,
FanCanvas Orientation,
Horizontal, AffectsArrange Affects
Measure. ,
MeasureOverride Orientation.
FanCanvas ,
. Spacing
.
overlap OverlapPanel,
. AngleIncrement
. .
, Spacing AngleIncrement, 10 , Orientation,
. , ,
.
FanCanvas Canvas,
MeasureOverride , Canvas (
SimpleCanvas ). ,
, , ,
(- ,
, ClipToBounds
true). ;
, . Canvas
!
,

. FanCanvas FanCanvas,
.
ArrangeOverride SimpleStackPanel,
,
RenderTransform .
GetStartingAngle, ,
,

(0 90 ).
(
, RenderTransform). ,

846

21.

,
.
FanCanvasItem,
;
.
, . FanCanvas ,
.
.21.4 FanCanvas
PlayingCard,
. - Spacing AngleIncrement,
!

Spacing=10, AngleIncrement=10 ( )

Spacing=10, AngleIncrement=30

Spacing=30, AngleIncrement=10

Spacing=0, AngleIncrement=30

Spacing=110, AngleIncrement=50
.21.4. FanCanvas PlayingCard

847


,
.
,
. ,
. /
, WPF,
,
.
,
. ,
. ,
Panel .

, VirtualizingPanel;
, , VirtualizingStackPanel.
- Panel (,
Canvas DockPanel),
, .

\\ ( ), 56
{} ( ), 56, 429

A
About,
Help, , 227
, 197
, 100
StackPanel, 117
, 200
, 111
Action, (
QueryContinueDragEventArgs), 208
ActiveEditingMode, (
InkCanvas), 366
ActiveX , 788
ActualHeight, (
FrameworkElement), 128
ActualWidth, (
FrameworkElement), 128
AddBackEntry, , 256
AddHandler, , 194
Aero Glass, 292
AlternationCount, (
ItemsControl), 321
AlternationIndex, (
ItemsControl), 321
AmbientLight, 632, 637
AmbientMaterial, , 644
AnchoredBlock, , 375
AngleX, (
SkewTransform), 141
AngleY, (
SkewTransform), 141
Angle, (
RotateTransform), 137

AnnotationService, , 380
ApplicationCommands, , 225
ApplicationPath, (
JumpTask), 279
Application,
Properties, , 239
Windows, , 239
Run, , 236
, 236
,
240
, 238
, 241
Apply, , 286
ArcSegment, , 538
Arguments, ( JumpTask),
279
ArrangeOverride, , , 828
AutoReverse, ( ), 686
AxisAngleRotation3D, , 627
AxMsTscAxNotSafeForScripting,
, 790

B
BAML (Binary Application Markup
Language), , 69, 70
XAML, 72
BAML2006Reader, , 78
BaseValueSource, , 115
BeginTime, ( ),
685
BezierSegment, , 538
Binding, , 66
BindingMode, , 459
BitmapCache, , 600
BitmapCacheBrush, , 601
BitmapEffect, , 595


BitmapScalingMode, (
RenderOptions), 353
BlackoutDates, (
Calendar), 387
BlockUIContainer, , 369
BlurEffect, 594
BooleanToVisibilityConverter, 437
BrushConverter, , 54
BuildWindowCore, , 756
Button, , 107, 306
ButtonAutomationPeer, , 307
ButtonBase, , 305
By, ( ), 684

C
C++/CLI, 753
Calendar, , 386
CAML (Compiled Application Markup
Language), , 70
Cancel, , 221
CanExecute, , 225
CanExecuteChanged, , 225
CanUserAddRows, (
DataGrid), 344
CanUserDeleteRows, (
DataGrid), 344
Canvas, , 147
Grid, 169
Center, (
RadialGradientBrush), 582
CenterX,
RotateTransform, 137
SkewTransform, 141
CenterY,
RotateTransform, 137
SkewTransform, 141
CheckBox, , 308
Class, , 67
ClearAllBindings, , 416
ClearBinding, , 416
ClearHighlightsCommand, 380
ClearValue, , 115
CLI (Common Language Infrastructure),
753
Click, , 306
ClickCount, (
MouseButtonEventArgs), 206
ClickMode, ( ButtonBase),
305
ClickOnce, 247
, 249

849
, 265
ClipboardCopyMode, (DataGrid),
342
ClipToBounds, (), 173
/clr, , 758
clr-namespace, , 62
Code, , 71
CoerceValueCallback, , 116
Collapsed, (
Visibility), 131
CollectionViewSource, , 449
Color, , 576
CombinedGeometry, , 545
ComboBox, , 326
ComboBoxItem, , 331
IsEditable, , 329
IsReadOnly, , 329
SelectionChanged, , 331
, 326
ComboBoxItem, , 331
ComCtl32.dll, 298
Complete, , 221
ComponentCommands, , 225
CompositeCollection, , 466
CompositionTarget_Rendering, , 787
ConstantAttenuation, (
PointLight), 634
ContainerUIElement3D, , 660
Content, , 394
Content, , 58
ContentControl, , 493
Frame, , 316
ContentControl, , 304, 493
ContentElement, , 100
ContextMenu, , 347
ContextMenuService, , 348
Control, , 100
Convert, , 436
ConvertXmlStringToObjectGraph, ,
90
CountToBackgroundConverter, ,
435
CreateBitmapSourceFromHBitmap,
, 781
CreateHighlightCommand, 380
CreateInkStickyNoteCommand, 380
CreateTextStickyNoteCommand, 380
CreateWindow, , 757
CurrentItem, (
ICollectionView), 447

850
CustomCategory, (
JumpItem), 280

D
D3DImage, , 781
DashStyle, ( Pen), 549
Data, ( DragEventArgs),
207
DataContext, , 426
DataGrid,
CanUserAddRows, , 344
CanUserDeleteRows, , 344
ClipboardCopyMode, , 342
EnableColumnVirtualization,
, 342
EnableRowVirtualization, ,
342
FrozenColumnCount, , 343
RowDetailsVisibilityMode, ,
342
SelectionMode, , 341
SelectionUnit, , 341
,
341
, 342
, 341

, 342
, 343
, 337
, 343
, 339
DataGridCheckBoxColumn, 339
DataGridComboBoxColumn, 339
DataGridHyperlinkColumn, 339
DataGridTemplateColumn, 339
DataGridTextColumn, 339
DataTrigger, , 485
DatePicker, , 388
DateValidationError, , 389
DeadCharProcessedKey, (
KeyEventArgs), 202
DeleteStickyNotesCommand, 380
DependencyObject, , 99, 108
DependencyPropertyHelper, , 115
DesiredSize, (
FrameworkElement), 127
DestroyWindowCore, , 756
DialogFunction, , 766
DiffuseMaterial, 640
Direct3D, 32


Direction,
DirectionalLight, 633
SpotLight, 637
DirectionalLight, 632
DirectX
WPF, 36, 781
, 34
, 30
WPF, 34
DispatcherObject, , 98
DispatcherPriority, , 242
DispatcherTimer, , 676
DisplayDateEnd, (
Calendar), 387
DisplayDateStart, (
Calendar), 387
DisplayMemberPath, , 321, 423
Dock, ( DockPanel), 154
DockPanel,

,
157
Grid, 170
, 154
, 154
DoNothing, (Binding), 439
DoubleAnimation, , 680
DownloadFileGroupAsync, , 271
DragEventArgs, , 207
Drawing, , 534
DrawingBrush, , 584
DrawingContext,
, 554
, 554
DrawingImage, , 536
DrawingVisual, , 535
DropDownClosed, , 326
DropDownOpened, , 326
DropShadowEffect, 594
Duration, ( ),
682
DwmExtendFrameIntoClientArea,
, 292
DynamicResource, , 407

E
Ease, , 710
EaseIn, , 712
EaseInOut, , 712
EasingFunction, , 689, 706

851


EasingFunctionBase, , 711
EasingMode, , 706
EditingCommands, , 226
EditingMode, (
InkCanvas), 366
EditingModeInverted, (
InkCanvas), 366
ElementHost, , 777
ElementName, ( Binding),
417
EllipseGeometry, , 537
EmbeddedResource,
, 395
EmissiveMaterial, 645
EnableClearType, (
BitmapCacheBrush), 601
EnableColumnVirtualization,
( DataGrid), 342
EnableRowVirtualization,
( DataGrid), 342
EnableVisualStyles, , 776
EndLineCap, ( Pen), 549
EndMember, (
NodeType), 82
EndObject, (
NodeType), 82
EndPoint, (
LinearGradientBrush), 578
EscapePressed, (
QueryContinueDragEventArgs), 208
EvenOdd, ( FillRule),
541
ExceptionValidationRule, , 464
Execute, , 225
Expander, , 318
Expansion, (
ManipulationDelta, 217
Expression Blend, 36, 38
ExtendGlassFrame, , 294

F
FanCanvas, 842
FileInputBox,

, 801
, 804
, 799
, 796
, 802
FillBehavior, ( ), 690

FillRule, (
PathGeometry), 541
Filter, (
ICollectionView), 446
FindResource, , 410
FirstDayOfWeek, (
Calendar), 388
FlowDirection, (
FrameworkElement), 134
FlowDocument, , 367
FlowDocumentPageViewer,
, 378
FlowDocumentReader, , 378
FlowDocumentScrollViewer,
, 378
FontSizeConverter, , 54
FormatConvertedBitmap, , 357
Frame, , 250, 314
FrameworkContentElement, , 100,
106, 367
FrameworkElement, , 100, 106
ActualHeight, , 128
ActualWidth, , 128
DesiredSize, , 127
FlowDirection, , 134
Height, , 126
HorizontalAlignment, , 132
HorizontalContentAlignment,
, 133
LayoutTransform, , 135
Margin, , 128
Padding, , 128
RenderSize, , 128
RenderTransform, , 135
Triggers, , 111
VerticalAlignment, , 132
Visibility, , 131
Width, , 126
FrameworkPropertyMetadata, 804
Freezable, , 99
From, ( ), 683
FromArgb, , 780
FrozenColumnCount, (
DataGrid), 343

G
GDI (Graphics Device Interface), 30
GDI+, 30
, 34
Geometry3D, , 647

852
GeometryCombineMode, ,
545
GeometryDrawing, , 534
GeometryModel3D, 632, 639
Geometry3D, , 647
MeshGeometry3D, , 648
Normals, , 651
Positions, , 648
TextureCoordinates, ,
653
TriangleIndices, , 650
, 639
AmbientMaterial, 644
DiffuseMaterial, 640
EmissiveMaterial, 645
, 647
GetCommandLineArgs, , 238
GetExceptionForHR, , 76
GetGeometry, , 538
GetHbitmap, , 781
GetInstalledVoices, , 735
GetIntermediateTouchPoints, , 212
GetObject, (
NodeType), 82
GetPosition, , 206
GetTouchPoint, , 212
GetValueSource, , 115
GetVisualChild, , 556
GlyphRunDrawing, , 535
GradientBrush, , 61
GradientOrigin, (
RadialGradientBrush), 582
GradientStop, , 577
GrammarBuilder, , 742
Grid, , 158
ShowGridLines, , 162

,
170

, 166

, 162
, 162
, 164
, 163
GridLength, 164

GridSplitter, 165
Canvas, 169
DockPanel, 170


StackPanel, 170
, 161
, 169
GridLength, , 164
GridLengthConverter, 164
GridSplitter, , 165
GridView, , 335
GridViewColumn, , 335
GroupBox, , 316
GroupDescriptions, (
ICollectionView), 443
GroupName, (
RadioButton), 310

H
Handled, (
RoutedEventArgs), 196
HandleRef, 756
HasContent, (
ContentControl), 304
HasItems, (
ItemsControl), 320
Header, ( ToolBar), 354
HeaderedItemsControl, , 345
Height, (
FrameworkElement), 126
Help, , 227
Hidden, (
Visibility), 131
HierarchicalDataTemplate, , 434,
455
HitTest, , 560
HitTestCore, , 565
HitTestFilterCallback, , 565
HitTestResultCallback, , 564
HorizontalAlignment, (
FrameworkElement), 132
HorizontalContentAlignment,
( FrameworkElement), 133
HostingWin32.cpp, , 757
HostingWPF.cpp, , 765
HwndHost, , 757
HwndSource, , 765
HwndSource, , 770

I
ICC (International Color Consortium), 577
ICommand, , 225
Icon, ( MenuItem), 346


IconResourceIndex, (
JumpTask), 279
IconResourcePath, (
JumpTask), 279
ICustomTypeDescriptor, , 420
IEasingFunction, , 710
IList, , 59
Image, , 356
ImageBrush, , 588
ImageDrawing, , 534, 535, 536
ImageSource, , 357
ImageSourceConverter, ,
356
ImeProcessedKey, (
KeyEventArgs), 202
InAir, ( StylusDevice),
210
InitializeComponent, , 70, 234
InitialShowDelay, (
ToolTip), 314
InkCanvas, , 365
Inline,
AnchoredBlock, 375
InlineUIContainer, 378
LineBreak, 376
Span, 374
, 373
Inlines, ( TextBlock), 362
InlineUIContainer, , 378
InnerConeAngle,
PointLights, 637
InputGestureText, (
MenuItem), 346
InputHitTest, , 574
IntelliSense, 97
Inverted, ( StylusDevice),
210
IsAdditive, ( ),
689
IsAsync, ( Binding), 457
IsCheckable, ( MenuItem),
346
IsChecked, (
ToggleButton), 308
IsCumulative, ( ), 690
IsDefault, ( Button), 107,
307
IsDefaulted, ( Button),
307
IsDirective, , 83

853
IsDown, ( KeyEventArgs),
202
IsEditable, ( ComboBox),
329
IsFrontBufferAvailableChanged, , 785
IsGrouping, (
ItemsControl), 320
IsIndeterminate, (
ProgressBar), 384
IsKeyboardFocused, (
UIElement), 204
IsKeyDown, , 204
IsMouseDirectlyOver, (
UIElement), 205
IsNetworkDeployed, , 271
IsolatedStorage, , 247
IsolatedStorageFile, , 247
IsolatedStorageFileStream, , 247
IsPressed, ( ButtonBase),
305
IsReadOnly, ( ComboBox),
329
IsRepeat, (
KeyEventArgs), 203
IsSelected, ( Selector),
326
IsSelectionActive, (
Selector), 326
IsSynchronizedWithCurrentItem,
( Selector), 425
IsTextSearchCaseSensitive,
( ItemsControl), 331
IsTextSearchEnabled, (
ItemsControl), 331
IsThreeState, (
ToggleButton), 308
IsToggled, (
KeyEventArgs), 202
IsUp, ( KeyEventArgs),
202
ItemHeight, (
WrapPanel), 152
Items, ( ItemsControl),
319, 425
ItemsCollection, , 334
ItemsControl,
AlternationCount, , 321
AlternationIndex, , 321
DisplayMemberPath, , 321
HasItems, , 320

854
IsGrouping, , 320
IsTextSearchCaseSensitive, ,
331
IsTextSearchEnabled, , 331
Items, , 319
ItemsPanel, , 321
ItemsSource, , 320
,
325
ItemsPanel, (
ItemsControl), 321
ItemsSource, , 343
ItemsSource, (
ItemsControl), 320, 425
ItemWidth, ( WrapPanel),
152
IValueConverter, , 435
IXamlLineInfo, , 83, 90
IXamlLineInfoConsumer, , 90

J
JavaScript, 32
JournalOwnership, (
Frame), 254
JumpItemRejectionReason, , 286
JumpItemsRejected, , 285
JumpItemsRemovedByUser, , 286

K
Kaxaml, 45
Key, , 202
Key, ( KeyEventArgs),
202
KeyboardDevice, (
KeyEventArgs), 203
KeyboardNavigation, , 353
KeyDown, , 202
KeyEventArgs, , 202
KeyStates,
KeyEventArgs, 203
QueryContinueDragEvent
Args, 207
KeyUp, , 202

L
Label, , 311
LastChildFill, (
DockPanel), 155


LayoutTransform, (
FrameworkElement), 135
LengthConverter, , 130
Light,
AmbientLight, 632, 637
DirectionalLight, 632, 633
PointLight, 632, 634
SpotLight, 632, 635
, 632
, 634
Line, , 570
LinearAttenuation, (
PointLight), 634
LinearGradientBrush, , 577
LineBreak, , 376
LineGeometry, , 538
LineJoin, ( Pen), 549
LineNumber, , 83
LinePosition, , 83
LineSegment, , 538
LINQ (Language Integrated Query), 452
ListBox,
SelectionMode, , 332
,
335
,
333
PlayingCard ,
816
, 332
, 334
, 324
, 334
ListView, , 335
Load, , 63, 89
LoadAsync, , 65
LoadComponent, , 72
LocBaml, ,
402
LogicalChildren, , 106
LogicalTreeHelper, , 104
LookDirection, ( Camera),
611

M
mage.exe, , 248
mageUI.exe, , 248
Main, , 235
MainWindow, , 233

855


ManipulationBoundaryFeedback, , 221
ManipulationCompleted, , 216
ManipulationDelta, , 216
ManipulationDeltaEventArgs, ,
217
ManipulationStarted, , 216
ManipulationStarting, , 216, 223
Margin, (
FrameworkElement), 128
MarkupExtension, , 55
MatrixCamera, , 620
MatrixTransform3D, , 631
MatrixTransform, , 142
MeasureOverride, , , 826
MediaCommands, , 226
MediaElement,
, 726
, 728
MediaPlayer, ,
MediaTimeline,
, 726
, 728
Menu, , 345
MenuItem, , 346
MergedDictionaries, (
ResourceDictionary), 408
MeshGeometry3D, , 648
Normals, , 651
Positions, , 648
TextureCoordinates, , 653
TriangleIndices, , 650
Microsoft Anna, 734
Microsoft Surface, 38
Model3D, , 631
. GeometryModel3D
Light,
AmbientLight, 632, 637
DirectionalLight, 632, 633
PointLight, 632, 634
SpotLight, 632, 635
, 632
, 634
Model3DGroup, , 632, 654
ModelUIElement3D, , 658
ModelVisual3D, , 656
Modifiers, (
KeyboardDevice), 203
Mouse, , 208
MouseButtonEventArgs, , 206
See

MouseButtonState, , 206
MouseEventArgs, , 206
MouseWheelEventArgs, , 206
mscorlib, , 75
MultiBinding, , 467
MultiPoint Mouse SDK, 212
MyHwndHost, , 756

N
Name, , 65
NamespaceDeclaration, (
NodeType), 82
Navigate, , 252
NavigationCommands, , 226
NavigationProgress, , 257
NavigationStopped, , 257
NavigationWindow, , 250
NodeType, , 82
None, ( NodeType), 83
NonZero, ( FillRule),
541
NoRegisteredHandler, ( JumpItemRejectionReason),
286
Normals, (
MeshGeometry3D), 651
null-, 205

O
Object, , 98
ObjectDataProvider, , 456
OneTime, , 459
OneWay, , 459
OneWayToSource, , 459
OnMnemonic, , 763
OnNoMoreTabStops, , 762
Opacity, (), 592
OpacityMask, (), 592
OpenGL, 30
Orientation,
ProgressBar, 384
StackPanel, 150
WrapPanel, 152
OriginalSource, (
RoutedEventArgs), 196
OrthographicCamera,
LookDirection, , 611
Position, , 608
UpDirection, , 614
Z-, 611

856

, 611
PerspectiveCamera, 617
OuterConeAngle,
PointLights, 637
OverlapPanel, 837
Overlay, (
TaskbarItemInfo), 288

P
pack, URI, 399
Padding, (
FrameworkElement), 128
Page, , 249
PageFunction, , 260, 261
Parse, , 90
partial, , 68
PasswordBox, , 364
Path, , 572
PathGeometry, , 538
Pen, , 548
PerspectiveCamera, , .
OrthographicCamera,
PInvoke, 293
PixelFormats, , 358
Play, , 723
PlayingCard,

, 807
, 812
,
807
, 807
, 814
, 813
ListBox, 816
PointLight, , 634
PolyBezierSegment, , 538
Polygon, , 572
Polyline, , 571
PolyLineSegment, , 538
PolyQuadraticBezierSegment, , 538
Position, (), 608
Positions, (
MeshGeometry3D), 648
PreferredXamlNamespace, , 83
PressureFactor, (
StylusPoint), 210
PreviewKeyDown, , 202
PreviewKeyUp, , 202
PrintLogicalTree, , 105
PrintVisualTree, , 105
See

PriorityBinding, , 468
ProgressBar, , 384
, 287
, 500, 511
ProgressState, (
TaskbarItemInfo), 288
ProgressValue, (
TaskbarItemInfo), 288
PromptBuilder, , 735
PropertyGrid
XAML, 775
, 773
PropertyGroupDescription, , 444

Q
QuadraticAttenuation, (
PointLight), 634
QuadraticBezierSegment, , 538
QuaternionRotation3D, , 627
QueryContinueDragEventArgs, ,
207

R
RadialGradientBrush, , 581
RadioButton, , 309
RadiusX,
RadialGradientBrush, 582
Rectangle, 568
RadiusY,
RadialGradientBrush, 582
Rectangle, 568
Range, ( PointLight), 636
RectangleGeometry, , 537
Reference, , 66
Refresh, , 255
Register, , 108
RelativeSource, (
Binding), 418
RemovedByUser, ( JumpItemRejectionReason), 286
RemoveHandler, , 194
RenderAtScale, (
BitmapCache), 599
Rendering, , 677
RenderSize, (
FrameworkElement), 127
RenderTargetBitmap, , 598


RenderTransform, (
FrameworkElement), 135
RenderTransformOrigin,
( FrameworkElement), 136
RepeatBehavior, (
), 687
RepeatButton, , 307
ResizeBehavior, (
GridSplitter), 166
ResizeDirection, (
GridSplitter), 166
Resource, , 394
ResourceDictionary, , 408
ResourceDictionaryLocation, , 526
RichTextBox, , 364
RotateTransform, 137
RotateTransform3D, , 627
Rotation, (
ManipulationDelta, 217
RoutedEvent, (
RoutedEventArgs), 196
RoutedUICommand, , 226
RoutingStrategy, , 195
RowDetailsVisibilityMode,
( DataGrid), 342
Run, , 236

S
Save, , 90
ScaleTransform, 139, 178
ScaleTransform3D, , 623
Scalr, (
ManipulationDelta, 216
scRGB, , 575
ScrollBar, , 175
ScrollViewer, , 175
SelectedDateChanged, , 389
SelectedIndex, ( Selector),
326
SelectedItem, ( Selector),
326
SelectedValue, ( Selector),
326
SelectionChanged, , 326, 331
SelectionMode,
Calendar, , 386
DataGrid, , 341
ListBox, , 332
SelectionUnit, (
DataGrid), 341
SelectiveScrollingGrid, , 172

857
Selector, , 325
SelectVoice, , 735
SelectVoiceByHints, , 735
Separator, , 346
SetBinding, , 416
SetCurrentValue, , 116
SetOutputToDefaultAudioDevice, ,
735
SetOutputToWaveFile, , 735
SetResourceReference, , 410
Settings, , 247
ShaderEffect, 596
ShowDialog, , 245
ShowDuration, ( ToolTip),
314
ShowFrequentCategory, (
JumpList), 284
ShowGridLines, ( Grid),
162
ShowOnDisabled,
ContextMenuService, 348
ToolTipService, 314
ShowRecentCategory, (
JumpList), 284
ShutdownMode, , 239
Silverlight, 38, 40, 215
SimpleCanvas, , 830
SimpleQuadraticEase, , 711
SimpleStackPanel, , 834
SkewTransform, , 141
Skip, , 88
Slider, , 385
SnapsToDevicePixels, (
BitmapCache), 39, 599, 601
Snoop, 36
SolidColorBrush, , 61, 575
SortDescription, , 450
SortDescriptions, , 441
SortDescriptions,
ICollectionView, 440
ItemsCollection, 334
SoundPlayer, , 723
SoundPlayerAction, , 724
Source,
MediaElement, 726
RoutedEventArgs, 196
SourceName, ( Trigger),
492
SpeakAsync, , 734
SpeakAsyncCancelAll, , 735
SpeechRecognitionEngine, , 738

858
SpeechSynthesizer, , 735
SpeedRatio, ( ), 686
SpotLight, 632
SpreadMethod, (
LinearGradientBrush), 578
sRGB, , 575
SRGS (Speech Recognition Grammar
Specification), 741
SSML (Speech Synthesis Markup
Language), 735
StackPanel, , 150

,
151
Menu, 347
, 117
Grid, 170
StartMember, (
NodeType), 82
StartObject, (
NodeType), 82
StartPoint, (
LinearGradientBrush), 578
StartupUri, (
Application), 237
STAThreadAttribute, 767
StaticResource, ,
407
StatusBar, , 354
StopLoading, , 255
Storyboard, ()
TargetName, , 694
TargetProperty, , 691
, 690
, 698
StreamGeometry, , 542
Stretch, , 132
Stretch, , 178
Stretch,
DrawingBrush, 585
MediaElement, 728
StringFormat, (
Binding), 428
Stroke, , 365
StylusButtonEventArgs, , 211
StylusButtons, (
StylusDevice), 210
StylusDevice, , 210
StylusDownEventArgs, , 211
StylusEventArgs, , 211


StylusPoint, , 210
StylusSystemGestureEventArgs, ,
211
Subclass, , 68
Surface Toolkit for Windows Touch, 224
SystemKey, (
KeyEventArgs), 202
System.Object, XAML, 53
SystemSounds, , 723
System.String, XAML, 53

T
TabControl, , 336
TabInto, , 761
TabletDevice, (
StylusDevice), 210
TargetName, , 694
TargetNullValue, (
Binding), 418
TargetProperty, , 694
TargetType,
ControlTemplate, 492
Style, 478
TaskDialog, 296
TemplateBindingExtension, , 493
TextBlock, , 360
TextBox, , 362
TextElement, , 368
Inline,
AnchoredBlock, 375
InlineUIContainer, 378
LineBreak, 376
Span, 374
, 373

AnchoredBlock, , 375
BlockUIContainer, 369
List, 369
Paragraph, 369
Section, 369
Table, 369
, 370
TextFormattingMode, (
TextOptions), 359
TextHintingMode, (
TextOptions), 360
TextOptions, , 359
TextRenderingMode, (
TextOptions), 359
TextureCoordinates, (
MeshGeometry3D), 653

859


ThemeDictionaryExtension, 527
ThemeInfoAttribute, 526
Thickness, , 128
ThicknessConverter, , 130
ThumbButtonInfos, (
TaskbarItemInfo), 290
ThumbnailClipMargin, (
TaskbarItemInfo), 289
TileMode, , 587
TileMode, (
DrawingBrush), 586
To, ( ), 683
ToggleButton, , 308
ToolBar, , 351
ToolBarOverflowPanel, , 171
ToolBarPanel, , 171
ToolBarTray, , 171
ToolPanel, , 171
ToolTip, , 312
ToolTipService, , 314
TouchDevice, (
TouchEventArgs), 212
TouchDown, , 213
TouchEventArgs, , 212
TouchMove, , 213
TouchUp, , 213
TraceSource, , 438
Transform, , 90
Transform, (), 615
Transform3D, 620
MatrixTransform3D, 621, 631
RotateTransform3D, 621, 627
ScaleTransform3D, 621, 623
Transform3DGroup, 621
TranslateTransform3D, 620, 623
, 630
TransformConverter, ,
143
TransformToAncestor, , 666
TransformToDescendant, , 670
Transitions, (
VisualStateGroup), 514
TranslateAccelerator, , 761
TranslateTransform, 142
TranslateTransform3D, , 623
Translation, (
ManipulationDelta, 216
TreeView, , 349
TreeViewItem, , 349
TriangleIndices, (
MeshGeometry3D), 650

TriggerBase, , 111
Triggers, (
FrameworkElement), 111
TryFindResource, , 410
TwoWay, , 459

U
UICulture, , 401
Uid, , 401
UIElement, , 99
IsKeyboardFocused, , 204
IsMouseDirectlyOver, , 205
RenderTransformOrigin, ,
136
, 422
UIElement3D, , 36, 99
ContainerUIElement3D, 660
ModelUIElement3D, 658
UniformGrid, , 172
UpdateLayout, , 128
UpdateSourceExceptionFilter,
( Binding), 465
UpdateSourceTrigger, , 461
UpDirection, (), 614
URI
,
397
pack, 399
UseLayoutRounding, , 39
USER, , 30

V
ValidateValueCallback, , 116
ValidationRules, (
Binding), 462
Value, ( NodeType), 82
ValueSource, , 115
VerticalAlignment, (
FrameworkElement), 132
VideoDrawing, , 534
Viewbox, , 178
Viewport2DVisual3D, , 36, 660
Viewport3D, , 663
Viewport3DVisual, , 666
VirtualizingPanel, , 152
VirtualizingStackPanel, , 152
Visibility, (
FrameworkElement), 131
Visible, (
Visibility), 131

860
Visual, , 99, 106
TransformToAncestor, , 666
Visual3D, , 99, 656
ModelVisual3D, 656
TransformToAncestor, , 670
TransformToDescendant, , 670
UIElement3D, , 658
VisualBrush, , 589
Visual C++, 766, 767
VisualChildrenCount, , 556
VisualStateGroup, , 514
Visual State Manager ( ), 38

, 716

, 712

,
508
, 505
Visual Studio 2010, 35
Visual Studio , 277
VisualTreeHelper, , 104
vshost32.exe, 277

W
Width, (
FrameworkElement), 126
Window, , 232
WindowInteropHelper, , 781
Windows, , 239
Windows 7,

Aero Glass, 292


TaskDialog, 296

, 287
, 287
, 290
, 288
, 289
WPF 4, 38
, 273
JumpPath, 282
JumpTask, 275
Visual Studio, 277
, 274
WindowsFormsHost, , 775
Windows Media Player, 727


Windows XP,
WPF, 40
WorkingDirectory, (
JumpTask), 279
WPF
, 30
, 32
WPF Toolkit, 35
WPF XAML Vocabulary Specification
2006 (MS-WPFXV), 46
WrapPanel, , 152
, 153

, 154
, 154
, 152
WriteableBitmap, , 37

X
x, , 49
x:Arguments, , 75, 93
x:Array, , 95
x:AsyncRecords, , 93
x:Boolean, , 93
x:Byte, , 93
x:Char, , 93
x:ClassAttributes, , 93
x:ClassModifier, , 93
x:Class, , 68, 93
x:Code, , 93
x:ConnectionId, , 93
x:Decimal, , 93
x:Double, , 93
x:FactoryMethod, , 76, 94
x:FieldModifier, , 94
x:Int16, , 94
x:Int32, , 94
x:Int64, , 94
x:Key, , 94
x:Members, , 77, 94
x:Name, , 66, 94, 492
x:Null, , 95
x:Object, , 94
x:Property, , 77, 94
x:Reference, , 96, 776
x:Shared, , 94, 409
x:Single, , 94
x:Static, , 96
x:String, , 94
x:Subclass, , 94

861


x:SynchronousMode, , 95
x:TimeSpan, , 95
x:TypeArguments, , 95
x:Type, , 96
x:Uid, , 95
x:Uri, , 95
x:XData, , 95
XAML (eXtensible Application Markup
Language), 33
BAML (Binary Application Markup
Language)
, 72
, 69
CAML (Compiled Application Markup
Language), 70
XAML2009, . XAML2009
XBAP-
. XAML Browser Application
(XBAPs)
, 271

, 690
TargetName, , 694
TargetProperty, , 691
, 697

, 698
PropertyGrid,
775
, 71
, 408
, 70
, 44
, 395
, 63
(XAML), 77, 78
XamlServices, , 89
, 86
XML, 88
, 81
, 44
Twitter, 469
, 92
, 67
, 52
BrushConverter, 54
FontSizeConverter, 54
GridLengthConverter, 164
ImageSourceConverter, 356
LengthConverter, 130
See

ThicknessConverter, 130
TransformConverter, 143
, 164

, 74
, 54
Binding, 417
, 47
, 47
, 65
,
63
, 47
, 132
, 61
, .
, 58
, 60
, 59
, 126
, 33, 43
, 45
, 43

, 48
XAML, 50
, 55
, 57
, 55
, 61
, 75
, 46
(XAML), 77
NodeType, , 82
XamlServices, , 89
XAML, 84
XAML-, 83
, 86
, 81
, 97
{} ( ), 429
, 51
XAML Browser Application (XBAPs), 263
, 269
, 269
, 268
ClickOnce, 265
, 265
, 268
, 267
See

862
XAML Cruncher, 45
XAML Object Mapping Specification 2006
(MS-XAML), 46
XAML2009
, 72
, 75
, 76
, 77
,
73
, 74

, 75
, 76
, 74
XamlBackgroundReader, , 78
XamlMember, , 83
XamlObjectReader, , 78
XamlObjectWriter, , 78
XamlPad, 45
XAMLPAD2009, 44
XamlPadX, 45, 102
XamlReader, , 78
Load, , 63
LoadAsync, , 65
XamlServices, , 89
XamlType, , 83
XamlWriter, , 72, 78
XamlXmlReader, , 80
XAML, 84
XAML-, 83
, 86
XamlXmlWriter, , 78
XML Paper Specification (XPS), 367
XML Path Language (XPath), 453
xml:lang, , 92
xml:space, , 92
XmlDataProvider, , 452
XmlnsDefinitionAttribute, , 48
XNA Framework, 31

Z
Z-, , 611
Z-, 149

, 162

, 335


,

, 823
, 160
XAML-, 271
, 116, 675
, 706

, 716
Button
, 712
, 701

AutoReverse, , 686
BeginTime, , 685
By, , 684
DoubleAnimation, , 680
Duration, , 682
EasingFunction, , 689
FillBehavior, , 690
From, , 683
IsAdditive, , 689
IsCumulative, , 690
RepeatBehavior, , 687
SpeedRatio, , 686
To, , 683
, 680
, 679
, 682
, 38
BackEase, 708
BounceEase, 708
CircleEase, 708
EasingMode, , 706
ElasticEase, 709
ExponentialEase, 709
SineEase, 709
, 710
, 707
, 681
, 676
, 676
, 699
, 703
, 700
, 706
, 702

XAML, 690
TargetName, , 694

863


TargetProperty, , 691
, 697

, 698
, 32
, , 238
, 34

XML, 52
XAML, 47
XAML, 47
,
MediaElement, 725
MediaPlayer,
MediaTimeline, 726
SoundPlayer, 723
SoundPlayerAction, , 724
SystemSounds, , 723
, 733
, 722


SRGS, 741
GrammarBuilder,
742

, 738
, 734
GetInstalledVoices, , 735
PromptBuilder, , 735
SelectVoice, , 735
SelectVoiceByHints, , 735
SetOutputToWaveFile, , 735
SpeakAsync, , 734
Speech Synthesis Markup
Language (SSML), 735
SpeechSynthesizer, , 735

XBAP-, 269
, 538
D3DImage, 786
,
(DataGrid), 341

, 559

BitmapCache, , 600
BitmapCacheBrush, , 601
RenderTargetBitmap, , 598
, 39
TextOptions, , 359
WPF 4,
359
, 428
, 434, 435,
438, 439
, 428
, 431
(Visual), 552
DrawingContext, , 554
DrawingVisual, , 553
, 556
Visual, 559
, 334, 342
, 733
, 322
, 698
, 37
, 242
, 195
, 225
, 341
, 116

, 70

CombinedGeometry, , 545
EllipseGeometry, , 537
Geometry3D, , 647
GeometryGroup, , 542
LineGeometry, , 538
MeshGeometry3D, , 648
PathGeometry, , 538
RectangleGeometry, , 537
StreamGeometry, , 542
, 538
, 537
, 546
, 603
,
542
, 253

LinearGradientBrush, , 577
RadialGradientBrush, , 581
GradientStop, 577

864

GradientSpreadMethod, 578
, 584

GrammarBuilder, , 742
Speech Recognition Grammar
Specification (SRGS), 741

, 35, 533
,
35, 533
, 443
, 269

, 398
XAML, 395
, 400
,
, 398
, 400
, 401

, 401

LocBaml, 402
, 393

, 552
DrawingContext, , 554
DrawingVisual, , 553
, 556
Visual,
559

CombinedGeometry, , 545
EllipseGeometry, , 537
Geometry3D, , 647
GeometryGroup, , 542
LineGeometry, , 538
MeshGeometry3D, , 648
PathGeometry, , 538
RectangleGeometry, , 537
StreamGeometry, , 542
, 538
, 537
, 546


, 603

, 542

BitmapCacheBrush, , 601
DrawingBrush, , 584
ImageBrush, , 588
LinearGradientBrush, , 577
RadialGradientBrush, , 581
SolidColorBrush, , 575
VisualBrush, , 589
, 592

, 404
, 584
, 575

, 402

MatrixTransform, 142
RotateTransform, 137
ScaleTransform, 139
SkewTransform, 141
Transform3D, 620
TranslateTransform, 142
, 175
, 143
, 145
, 135
,
660, 665
Visual.TransformToAncestor,
, 666
Visual3D.TransformToAncestor,
, 670
Visual3D.TransformToDescen
dant, , 670
, 666

Drawing, , 534
DrawingContext, , 554
DrawingImage, , 536
DrawingVisual, , 535
GeometryDrawing, , 534
GlyphRunDrawing, , 535
ImageDrawing, , 534
Pen, , 548
VideoDrawing, , 534
, 550
WPF 3.5, 36
, 566

865


Ellipse, , 569
Line, , 570
Path, , 572
Polygon, , 572
Polyline, , 571
Rectangle, , 568
,
Shape, 573
, 569
, 567
, 594
, 33
, 178

CoerceValueCallback, 116
ValidateValueCallback, 116
, 202

, 102
, 100

About
, 100


StackPanel, 117

, 111
TaskDialog, 296
,
Win32, 771
WPF, 764, 776
Windows Forms, 781
, 233
, 244
, 244
, 243
, 383
ProgressBar, 384
Slider, 385

AnchoredBlock, , 375
BlockUIContainer, 369
List, 369
Paragraph, 369
Section, 369
Table, 369
, 367
, 378

, 370
, 380
Inline
AnchoredBlock, , 375
InlineUIContainer, 378
LineBreak, 376
Span, 374
, 373
, 367


, 228
, 254

XAML ,
63
(XAML), 77, 78
XamlServices, , 89
, 86
XML, 88
, 81
, 242
, 68, 807
, 634
, 208

,
, 401
, 98
,
Shape, 573
, 550
DrawingContext, 554
WindowHostingVisual.cs, 556
, 246
, 492
, 45
, , 219
WPF, 32
, 36
, 747
C++/CLI, 753
, 749
DirectX, 36, 781
ActiveX, 788

866
Win32,
750
HwndSource, , 765
Webcam, ,
750
, 760
, 768
, 764, 771
Windows
Forms, 772
ElementHost, , 777
PropertyGrid, 773
, 776, 781
,
780


Calendar, 386
DatePicker, 388

LookDirection, , 611
MatrixCamera, , 620
Position, , 608
Transform, , 615
UpDirection, , 614
Z-, 611
, 611
,
617
, 607

BitmapCacheBrush, , 601
DrawingBrush, , 584
ImageBrush, , 588
LinearGradientBrush, , 577
RadialGradientBrush, , 581
SolidColorBrush, , 575
VisualBrush, , 589
, 592
, 404
, 584
, 575

, 402

, 353
Win32, 760


.NET, 37

Button, , 107, 306


ButtonBase, , 305
CheckBox, , 308
RadioButton, , 309
RepeatButton, , 307
ToggleButton, , 308
, 305
, 306
, 306
, 695
, 712

ItemsSource, 343
Properties, 239
SortDescriptions, 441
Triggers, 111
Windows, 239
, 440
, 443
, 447
, 449
, 440
, 446
, 422
, 60
, 59
, 224
, 225

, 228

, 819
, 229

, 647
, 143
Transform3D, 630
,
, 380
XAML, 51

, 125, 825
FanCanvas, 842
OverlapPanel, 837
SimpleCanvas, 830
SimpleStackPanel, 834

867


, 826
, 173
, 177
, 173
, 175
, .
, 132

, 132
, 133
, 133
, 134

MatrixTransform, 142
RotateTransform, 137
ScaleTransform, 139
SkewTransform, 141
Transform3D, 620
TranslateTransform, 142
, 175
, 143
, 145
, 135
, Visual
Studio, 182
, 126
, 131
, 126
, 127
, 128
, 434
Binding.DoNothing, 439
ValueMinMaxToIsLargeArcCon
verter, 504

, 439
, 438

, 435
, 52
BrushConverter, 54
FontSizeConverter, 54
GridLengthConverter, 164
ImageSourceConverter, 356
LengthConverter, 130
ThicknessConverter, 130
TransformConverter, 143
, 164
See

,
74
, 54

Expander, , 318
Frame, , 314
GroupBox, , 316
Label, , 311
ToolTip, 312
, 249
, 427
, 427

BitmapCache, , 600
BitmapCacheBrush, , 601

Viewport2DVisual3D, 662

, 680
, 45
, 100
, 402

, 411
, 404
, 409
, 410
, 406
, 411
, 406
, 400

, 401
, 401

LocBaml, 402
, , 115

, 216
, 219
, 193
RoutedEventArgs, , 196

, 804
, 201

868
About,
196
, 199
, 200
, 194
, 195
, 177
ScaleTransform3D, , 623
, 627
, 357
, 639
AmbientMaterial, 644
DiffuseMaterial, 640
EmissiveMaterial, 645
, 647

ContextMenu, ,
347
Menu, , 345
MenuItem, , 346
(), 611
, 763

ComboBox, , 326
ComboBoxItem, , 331
IsEditable, , 329
IsReadOnly, , 329
SelectionChanged, , 331
, 326
ContextMenu, 347
DataGrid,
CanUserAddRows, , 344
CanUserDeleteRows, ,
344
ClipboardCopyMode, ,
342
EnableColumnVirtualization,
, 342
EnableRowVirtualization,
, 342
FrozenColumnCount, ,
343
RowDetailsVisibilityMode,
, 342
SelectionMode, , 341
SelectionUnit, , 341

, 341
, 342
, 341



, 342
, 343
, 337
, 343
, 339
GridView, , 335
ItemsControl,
AlternationCount, , 321
AlternationIndex, , 321
DisplayMemberPath, ,
321
HasItems, , 320
IsGrouping, , 320
IsTextSearchCaseSensitive,
, 331
IsTextSearchEnabled, ,
331
Items, , 319
ItemsPanel, , 321
ItemsSource, , 320
, 325
ListBox,
SelectionMode, , 332
, 335

, 333

PlayingCard , 816
, 332
, 334

, 324
, 334
ListView, 335
Menu, 345
Selector, , 325
StatusBar, 354
TabControl, 336
ToolBar, 351
TreeView, 349
,
325
(MDI),
240
, 241
, , 38
See

XBAP-, 268
, 447
, Win32, 760
,
, 288

, 111
, 98
, 475
, 32
,
130
, 233
.NET, 49
, , 479
, 652

, 194
, 472, 517
, , 523
, , 520
, 518, 522
, 521
, 464
, 76
, 47
, 47
, 65
, 63
, 47
, 132

, 132
, 133
, 133
, 134
, 61

MatrixTransform, 142
RotateTransform, 137
ScaleTransform, 139
SkewTransform, 141
Transform3D, 620
TranslateTransform, 142
, 175

869
, 143
, 145
, 135
, 58
, 60
, 59
, 126
, 131
, 126
, 127
, 128

Object, , 98
, 102
, 86
, 100
, 420

, 75
, 76

ContentControl, , 304
, 305

Button, , 107, 306


ButtonBase, , 305
CheckBox, , 308
RadioButton, , 309
RepeatButton, , 307
ToggleButton, , 308
, 305
, 306
, 306

, 695
, 712

Expander, , 318
Frame, , 314
GroupBox, , 316
Label, , 311
ToolTip, 312
, 249
, 304
(STA), 235
(Visual C++), 767
, 374
, 173, 175

870

, 115
, 416

, 146
Canvas, 169, 172
DockPanel,

, 157
Grid,
170
, 154
, 154
Grid, , 158
ShowGridLines, , 162

, 170

, 166

, 162164

GridSplitter, 165
Canvas, 169
DockPanel, 170
StackPanel, 170
, 161
,
169
SelectiveScrollingGrid, 172
StackPanel, , 150

, 151
Menu, 347
, 117
Grid,
170
TabPanel, 171
ToolBarOverflowPanel, 171
ToolBarPanel, 171
ToolBarTray, 171
UniformGrid, 172
WrapPanel, , 152
, 153


, 154
See

See

, 154
, 152
, 125, 825
FanCanvas, 842
OverlapPanel, 837
SimpleCanvas, 830
SimpleStackPanel, 834
, 826
,
. ,

, Visual
Studio, 182
, , 287
, 290
, 287
, 288
, 289
, 749
, ,
173
, 177
, 173
, 175
, 38
BackEase, 708
BounceEase, 708
CircleEase, 708
EasingMode, , 706
ElasticEase, 709
ExponentialEase, 709
SineEase, 709
, 710
, 707
(), 716

BaseValueSource, 115
BindingMode, 459
DayOfWeek, 388
DispatcherPriority, 242
GeometryCombineMode, 545
GradientSpreadMethod, 578
JumpItemRejectionReason, 286
Key, 202
MouseButtonState, 206
PixelFormats, 358
RoutingStrategy, 195
ShutdownMode, 239
Stretch, 178
See


StretchDirection, 179
TileMode, 587
UpdateSourceTrigger, 461
Visibility, 131
, 45

, 39
, 130
, 596

RotateTransform3D, , 627
, 219
, 217
, 132

, 132
, 133
, 133
, 134


, 796
, 401
PlayingCard, 813


, 801
, 804
, 794, 799
, 796
, 802
, 795
, 649
, 451
ObjectDataProvider, , 456
XmlDataProvider, , 452
, , 459
, 499
, 461
, 649, 654
, 363
, 609

, 443
, 447
, 440
, 448, 449
, 440
, 446
, , 74

871

MatrixTransform, 142
RotateTransform, 137
ScaleTransform, 139
SkewTransform, 141
Transform3D, 620
TranslateTransform, 142
, 175
, 143
, 145
, 135
, 660,
665
Visual.TransformToAncestor, ,
666
Visual3D.TransformToAncestor,
, 670
Visual3D.TransformToDescendant,
, 670
, 666

, 255
, 199
, 36
Binding, , 414
ElementName, , 417
IsAsync, , 457
RelativeSource, , 418
StringFormat, , 428
TargetNullValue, , 418
UpdateSourceExceptionFilter,
, 465
UpdateSourceTrigger, ,
460
ValidationRule , 462
XAML, 417
, 414

DataContext, 426
, 461
UIElement, 422
, 422
, 420
.NET, 419
, 416
CompositeCollection, , 466
Language Integrated Query (LINQ),
452
MultiBinding, , 467
PriorityBinding, , 468
, 701

872
, 457
, 439
Twitter XAML,
469
, 458
, 459
, 440
, 443
, 447
, 449
, 440
, 446
, 414
, 438
, 451
ObjectDataProvider, , 456
XmlDataProvider, , 452
, 428
, 440
, 428
, 431

Windows-, ,
231
Application, , 236
ClickOnce, 247
Window, , 232
, 240
, 242
, 241
,
244
, 238
, 246
,
243
Windows, 247
XBAP-,
. XAML Browser Application
(XBAPs)
XAML-, 271
, 261

Win32 WPF-, 750
, 760
Webcam,
750

Windows Forms WPF-, 772


PropertyGrid, 773

WPF Win32-
HwndSource, , 765
, 768

WPF Windows
Forms
ElementHost, , 777
, 781
, 780
, 274

(MDI), 240
, 249
Navigate, , 252
,
259
, 253
, 254
, 249
, 258
, 256
Page, 249
, 37

, 120
About,
117
, 117
, 119
, 200

Visual, 559

, 564
, 566

, 560
, 560
, 662
, 559
InputHitTest, , 574
,
205
, 584

BitmapCache, , 600

873


BitmapCacheBrush, , 601
RenderTargetBitmap, , 598

BitmapCache, , 600
BitmapCacheBrush, , 601

Viewport2DVisual3D, 662

, 175
ListBox, 334
, 48
.NET, 48
, 49
XAML, 50
XML, 48, 51
, 48

, 676
XAML, 71
PropertyGrid, 773
, 400
Binding, 414

AutoReverse, , 686
BeginTime, , 685
By, , 684
DoubleAnimation, , 680
Duration, , 682
EasingFunction, , 689
FillBehavior, , 690
From, , 683
IsAdditive, , 689
IsCumulative, , 690
RepeatBehavior, , 687
SpeedRatio, , 686
To, , 683
, 680
, 679
, 682
, 52, 164
BrushConverter, 54
FontSizeConverter, 54
GridLengthConverter, 164
ImageSourceConverter, 356
LengthConverter, 130
ThicknessConverter, 130
TransformConverter, 143
, 521

,
410
, 676
, 57
XAML, 46

, 624
XAML , 63

ClickOnce, 247
XBAP-, 269
WPF 3.5, 37
WPF 4, 39
Windows, 248


SRGS, 741

GrammarBuilder, 742

, 738
, 55
, 57
, 55
XAML, 61
, 393
, 479
, .
, 395400
, 400402
, 393
, 402

, 411
, 404
, 409

, 410
, 406
, 411
,
406

Drawing, , 534
DrawingBrush, , 535
DrawingContext,
, 554
DrawingImage, , 535
DrawingVisual, , 535
GeometryDrawing, , 534
See

874

GlyphRunDrawing, , 535
ImageDrawing, , 534
Pen, , 548
VideoDrawing, , 534
, 550
WPF 3.5, 36,
37

, LocBaml, 402

.NET, , 419
Properties, , 239
, 47
, .
, 108
, 48
, 322
, 109, 481, 697
, 51
, 106, 477

, 802
, 111
, 113
, 116
,
114
, 116
, 116
, 116
, 499

,
120

About, 117
, 117
, 119
, 107
, 109
, 109
, 58, 63
, 734
GetInstalledVoices, , 735
PromptBuilder, , 735
SelectVoice, , 735
SelectVoiceByHints, , 735
See

SetOutputToWaveFile, , 735
SpeakAsync, , 734
Speech Synthesis Markup Language
(SSML), 735
SpeechSynthesizer, , 735
, 607
, 60

Click, 306
DateValidationError, 389
DropDownOpened, 326
JumpItemsRejected, 285
JumpItemsRemovedByUser, 286
Rendering, 676
SelectedDateChanged, 389
SelectionChanged, 326, 331
, 47
, 202

RoutedEventArgs, , 196

, 804

About, 197
, 193
, 199
, 200
, 194
, 195

, 216
, 211, 212
, 205
MouseButtonEventArgs, 206
MouseEventArgs, 206
MouseWheelEventArgs, 206
, 208
, 207
null-, 205
, 256
, 194
, 48
, 209

, 75
, 76
, 334, 440

VSM, 505

875


, 500
, 246
, 508, 819
, 36
, 59
Listbox,
SelectionMode, , 332
, 335

, 333

PlayingCard , 816
, 332
, 334

, 324
, 334
ListView, , 335
, .
, 38, 273
JumpPath, 282
, 283
,
284

, 285
JumpTask, 275
, 277
, 275
Visual Studio, 277
, 274
, 243
, 472, 473
, 479
, 479
, 514

, 474
, 475
, , 479
, 475
, 477
, , 520
Setter, 477
, 115
, 115, 525
, 479
, 481
,
486
See

, 485
, 487
, 481

, 500
(Grid)
, 339
, 166

, 162
, 162
, 164

GridSplitter, 165
, 163
GridLength, 164
, 343
, 339

XAML , 271
, 259
, 255
, 258
, 255
Page, 249


, 546
, 428
(XAML), 77
NodeType, , 82
XamlServices, , 89
XAML, 84
XAML-, 83
, 86
, 81

InkCanvas, , 365
PasswordBox, ,
364
RichTextBox, ,
364
TextBlock, , 360
TextBox, , 362
TextOptions, , 359
, 39, 358
,
.
See

876

, 738
, 654
, 472, 524
, 526
, 115, 525
, 526, 814
, 526, 814

XAML2009, 75
, 435

Model3D, , 631
GeometryModel3D, 639
Light, , 631
Model3DGroup, , 654
ModelVisual3D, , 632, 656
Transform3D, 620
MatrixTransform3D, 621, 631
RotateTransform3D, 621, 627
ScaleTransform3D, 621, 623
Transform3DGroup, 621
TranslateTransform3D, 620, 623
, 630
UIElement3D, , 658
Viewport2DVisual3D, , 660
Viewport3D, , 663
Visual3D, 656
, 32
GDI, 34
, 39
, 607

LookDirection, , 611
MatrixCamera, , 620
Position, , 608
Transform, , 615
UpDirection, , 614
Z-, 611
, 611
, 617
, 607
, 654
, 639
AmbientMaterial, 644
DiffuseMaterial, 640
EmissiveMaterial, 645
, 647

, 32


, 602
,
660, 665
Visual.TransformToAncestor,
, 666
Visual3D.TransformToAncestor,
, 670
Visual3D.TransformToDescen
dant, , 670
, 666
, 603

, 662
, 608
WPF 3.5, 36
, 481
,
490
, 486
, 487
, 486
, 111, 485
, 487
, 109, 481
, 111

, 500
, 195

,
XAML2009, 73
, , 754
Windows, 248

(Shape), 566
Ellipse, , 569
Line, , 570
Path, , 572
Polygon, , 572
Polyline, , 571
Rectangle, , 568
Shape, 573
, 569
, 567
, 446
, 428

877

, 577

, 505, 818

HierarchicalDataTemplate, 455
, 431
Windows, 530
, 472, 488
, 434
, 525
, c.


HierarchicalDataTemplate, 455
, 434
, 488
TargetType, , 492

VSM, 505
, 500
, 492
, 514
, 492
, 496
, 489
, 516
, 490
-
Content, , 493

, 499
, 496
See

, 628
XML, 52

ActiveX, 788
Calendar, 386
ComboBox, 326
ComboBoxItem, , 331
IsEditable, , 329
IsReadOnly, , 329
SelectionChanged, , 331

, 326
ContextMenu, 347
DataGrid
CanUserAddRows, , 344
CanUserDeleteRows, ,
344
ClipboardCopyMode, ,
342
EnableColumnVirtualization,
, 342
EnableRowVirtualization,
, 342
FrozenColumnCount, ,
343
RowDetailsVisibilityMode,
, 342
SelectionMode, , 341
SelectionUnit, , 341

, 341
, 342
, 341

, 342
, 343
, 337
, 343
, 339
DatePicker, 388
GridView, 335
InkCanvas, 365
ItemsControl,
AlternationCount, , 321
AlternationIndex, , 321
DisplayMemberPath, ,
321
HasItems, , 320
IsGrouping, , 320
IsTextSearchCaseSensitive,
, 331
IsTextSearchEnabled, ,
331
Items, , 319
ItemsPanel, , 321
ItemsSource, , 320
, 325
ListBox
SelectionMode, , 332
, 335

878

, 333

PlayingCard , 816
, 332
, 334

, 324
, 334
ListView, 335
Menu, 345
PasswordBox, 364
ProgressBar, 384
RichTextBox, 364
ScrollViewer, 175
Selector, , 325
Slider, 385
StatusBar, 354
TabControl, 336
TextBlock, 360
TextBox, 362
ToolBar, 351
TreeView, 349

Button, , 107, 306


ButtonBase, , 305
CheckBox, , 308
RadioButton, , 309
RepeatButton, , 307
ToggleButton, , 308
, 305
, 306
, 306

, 695
, 712

Expander, , 318
Frame, , 314
GroupBox, , 316
Label, , 311
ToolTip, 312
, 249

, 823
, 807
, 819
, 794
,
813


, 808
, 806
, 819
,
795
, 814
, 818
, 303


, 801
,
804
, 794, 799
,
796
, 802
, 796
,
795

, 229
, 508, 819
, 505, 818
, 594

, 634

Qt.

++
560 .,



Qt.
,
+ , ,

.
, Qt 4.6.
,
Windows, Mac OS X Linux Qt 4.6
( Qt 4.5) Qt.


,

480 .,

,
, , wiki-
-, -
, ,
,
.
, -: , ,
.. Java
, ,
.
,
, .


1995

.

,
.
: OReilly, Pearson Education, NewRiders,
Addison Wesley, Wiley, McGrawHill, No Starch Press, Packt, Dorset
House, Apress .


, , .
:
:

. . 16 , . 7 (. ),
. (812) 380-5007
:

. , . 13 (. ),
. (495) 638-5305

http://www.symbol.ru

.

www.symbo l . r u

,
.
, , www.symbol.ru.

. !

S-ar putea să vă placă și