30天学通C#项目案例开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5.1 基本用户界面功能的实现

要实现“添加联系人”用户控件,请先创建一个Controls文件夹,右键单击该文件夹,添加一个新的WPF用户控件,命名为AddNewFriendControl.xaml。

“添加联系人”用户控件的主体布局由一个Grid布局控件组成,内部包含一个DockPanel控件,在DockPanel内部使用了两个Canvas画布,一个用于设置标题栏,一个用于放置实际的添加联系人内容。XAML大纲视图如图2.14所示。

图2.14 添加联系人用户界面大纲视图

首先,看一下已经完成后的控件的声明部分,代码如下所示。

代码位置:见光盘中本章源代码的Controls\ AddNewFriendControl.xaml文件。

01  <UserControl
02       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
03       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
04       x:Class="MyFriends.AddNewFriendControl"
05       x:Name="Control"
06       Width="750" Height="500" Background="{x:Null}"
07     AllowDrop="True"
08       >
09  <!--中间关于界面布局的代码略-->
10  </UserControl>

● 第06行代码中,设置了控件的高度和宽度,并指定Background为空值。

● 第07行的AllowDrop属性是指是否允许控件作为拖放的目标,这将允许用户拖动图片或多媒体文件到控件上。

在整个用户控件的最外部,使用了一个Border控件来创建一个圆角矩形的外边框,使得用户控件更具吸引力。接下来创建一个Canvas,用于设置用户控件的标题栏。XAML定义代码如下所示。

代码位置:见光盘中本章源代码的Controls\ AddNewFriendControl.xaml文件。

01     <Grid x:Name="LayoutRoot" Opacity="1">
02         <!--在整个控件的外部,用一个Border设置边框-->
03         <Border HorizontalAlignment="Stretch"
04               Margin="0,0,0,0" Width="Auto"
05               Background="#FF000000"
06               BorderBrush="#FFD0601D"
07               BorderThickness="5,5,5,5"
08               CornerRadius="5,5,5,5">
09         <!--添加一个用于用户界面布局的DockPanel控件-->
10            <DockPanel Width="Auto" Height="Auto" LastChildFill="True">
11         <!--添加一个用于定义标题栏的Canvas-->
12               <Canvas Margin="0,-1,0,0" x:Name="cansTop"
13                     VerticalAlignment="Top" Width="Auto"
14                     Height="100" DockPanel.Dock="Top">
15         <!--使用属性元素语法定义渐变色-->
16                  <Canvas.Background>
17                     <LinearGradientBrush EndPoint="0.628,0.051"
18                                      StartPoint="0.628,0.788">
19                        <GradientStop Color="#FFD0601D" Offset="0"/>
20                        <GradientStop Color="#FFFFB917" Offset="1"/>
21                     </LinearGradientBrush>
22                  </Canvas.Background>
23          <!--添加左侧用于修饰红色椭圆-->
24                  <Ellipse Fill="#FFFFFFFF" Stroke="#FFFF6717"
25                         StrokeThickness="5" Width="90"
26                         Height="90" Panel.ZIndex="1"
27                         Canvas.Left="7" Canvas.Top="4"/>
28           <!--添加右侧用于修饰红色椭圆-->
29                  <Ellipse Fill="#FFFEFEFE" Stroke="#FFFF6717"
30                         StrokeThickness="5" Width="50"
31                         Height="50" Panel.ZIndex="0"
32                         Canvas.Left="685" Opacity="0.5"
33                         Canvas.Top="23"/>
34           <!--添加左侧的图标-->
35                  <Image Width="73.196" Height="66.02"
36                       Panel.ZIndex="1" Source="..\Images\myFriends.png"
37                       Canvas.Left="14" Canvas.Top="13"/>
38            <!--添加右侧的图标-->
39                  <Image Width="37.196" Height="33.549"
40                       Panel.ZIndex="1" Source="..\Images\myFriends.png"
41                       Opacity="0.4" Canvas.Left="690" Canvas.Top="30"/>
42            <!--添加中间的“添加联系人”图像-->
43                  <Image Width="230.222" Height="37"
44                       Canvas.Left="104.778" Canvas.Top="31"
45                       Source="..\Images\AddFriendWords.png"/>
46               </Canvas>

● 第03~08行代码,在用户控件的最外层使用了一个Border控件来定义圆角外观。

● 第10行代码定义了用于整体用户界面布局的DockPanel控件。

● 从第12行代码开始,将开始定义控件标题栏的外观,首先在第19~22行代码定义了画布的背景。

● 第24~34行定义了两个用于修饰矩形。

● 第34~45行代码添加了三幅图片,用于显示图标和控件标题信息。

创建了标题栏,接下来创建用户输入的窗体,从文档大纲视图中可以看到,用户输入栏包括了用于输入名字和Email的TextBox和Label控件,用于允许用户添加图片的Image控件,用于保存和选择新图像的Button控件,以及一个用于显示高级内容的Expander控件。

输入用户名及电子邮件的是两个TextBox控件,分别使用两个Label控件向用户标识其要输入的内容。位于其下面的是一个Expander控件,它提供了联系人多媒体信息的输入,部分XAML代码如下所示。

代码位置:见光盘中本章源代码的Controls\ AddNewFriendControl.xaml文件。

01     <!--定义用户高级选项折叠区域-->
02     <Expander Header="高级选项" x:Name="expAdvancedOptions"
03             Foreground="#FFFFFFFF"
04             Style="{DynamicResource ExpanderOrangeStyle}"
05             Canvas.Left="63" Canvas.Top="186" Width="522"
06             Height="197" FontWeight="Bold">
07         <!--使用StackPane进行布局-->
08         <StackPanel Orientation="Vertical" Margin="0,20,0,0">
09            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
10         <!--添加一个圆角的Border控件-->
11               <Border Width="60" Height="60" Background="#FFFFFFFF"
12                     BorderBrush="{x:Null}" CornerRadius="5,5,5,5"
13                     HorizontalAlignment="Left">
14         <!--使用Grid控件来接受拖放操作-->
15                  <Grid x:Name="videoGrid" Drop="videoGrid_Drop"  >
16                     <TextBlock HorizontalAlignment="Center"
17                              VerticalAlignment="Center"
18                              Text="向这里拖一个视频文件" Width="61"
19                              TextAlignment="Center"
20                              TextWrapping="WrapWithOverflow"
21                              FontFamily="Arial" FontSize="11"
22                              FontWeight="Normal" Foreground="#FF000000"/>
23          <!--使用MediaElement来播放多媒体文件-->
24                     <MediaElement x:Name="videoSrc"
25                                LoadedBehavior="Manual"
26                                Stretch="Fill" Margin="5,5,5,5"/>
27                  </Grid>
28               </Border>
29               <!--播放视频按钮-->
30                    <Button x:Name="btnVideoPlay" ToolTip="播放视频"
31                     Template="{DynamicResource GlassButton}"
32                     Width="20" Height="20" Content="4"
33                     Canvas.Left="683" Canvas.Top="166"
34                     Foreground="#FF54FB0C" FontSize="15"
35                     Margin="20,0,0,0" FontFamily="Webdings"
36                     Click="btnVideoPlay_Click"/>
37               <!--停止播放视频按钮-->
38                    <Button x:Name="btnVideoStop" ToolTip="停止播放"
39                     Template="{DynamicResource GlassButton}"
40                     Width="20" Height="20" Content="&lt;"
41                     Canvas.Left="683" Canvas.Top="166"
42                     Foreground="#FFFFFFFF" FontSize="12"
43                     Margin="20,0,0,0" FontFamily="Webdings"
44                     Click="btnVideoStop_Click"/>
45               <!--放置文本-->
46               <TextBlock Margin="10,0,0,0" Text="你朋友喜欢的视频文件"
47                       TextAlignment="Justify"
48                       TextWrapping="WrapWithOverflow"
49                       FontFamily="Arial" FontSize="11"
50                       FontWeight="Normal"
51                       Foreground="#FFFFFFFF"
52                       VerticalAlignment="Center"/>
53            </StackPanel>

● 第02~06行代码定义了一个Expander控件,注意它指定了Style属性为定义在资源中的名为ExpanderOrangeStyle动态样式,该文件在Application中使用合并字典的功能,合并到了应用程序级的资源中,因此可以在应用程序的任何位置调用该资源。

● 从第07行代码开始,进行界面的布局,在第15行使用了一个Grid控件,该控件将接受用户的拖放,意味着用户可以从资源管理器中拖动一个视频文件到该Grid上面。

● 第24行代码定义了一个MediaElement对象用来播放多媒体文件。

● 第29~44行代码定义了两个按钮,分别用于播放视频和停止播放。这两个按钮的Template属性,指定了定义在Resource文件夹下的Template.xaml文件中的模板。

● 第46~52行代码定义了一行文本显示标题信息。

最后是选择联系人图片按钮的布局,与选择多媒体文件的代码比较相似,并且也允许用户从资源管理器中拖动图像,代码如下所示:

代码位置:见光盘中本章源代码的Controls\ AddNewFriendControl.xaml文件。

01         <!--选择图片区域-->
02         <Border Width="100" Height="100"
03               Background="#FFFFFFFF"
04               BorderBrush="{x:Null}"
05               CornerRadius="5,5,5,5"
06               Canvas.Left="603" Canvas.Top="60">
07            <!--定义一个允许接受拖入操作的Grid-->
08            <Grid x:Name="imgGrid" Drop="imgGrid_Drop" >
09               <!--用于显示文字信息的TextBlock控件-->
10               <TextBlock Margin="5,5,5,5"
11                       HorizontalAlignment="Center"
12                       VerticalAlignment="Center"
13                       Text="拖一幅图像到这里" Width="80"
14                       TextAlignment="Center"
15                       TextWrapping="WrapWithOverflow"
16                       FontFamily="Arial" FontSize="11"
17                       FontWeight="Normal"/>
18               <!--用于显示图像的Image控件-->
19               <Image x:Name="photoSrc" Margin="5,5,5,5" Stretch="Fill" />
20            </Grid>
21         </Border>
22         <!--定义选择图像的按钮-->
23       <Button x:Name="btnChooseNewImage"
24               ToolTip="选择一幅图像"
25               Template="{DynamicResource GlassButton}"
26               Width="20" Height="20" Content="..."
27               Canvas.Left="683" Canvas.Top="166"
28               Foreground="#FFFFFBFB"
29               Click="btnChooseNewImage_Click"
30               FontSize="9"/>
31         <!--用于保存联系人信息的按钮-->
32       <Button x:Name="btnSave" ToolTip="保存新的联系人信息"
33               Template="{DynamicResource GlassButton}"
34               Width="101" Height="25" Content="保存联系人"
35               Foreground="#FFFFFBFB" FontSize="11"
36               Canvas.Left="601" Canvas.Top="243"
37               Click="btnSave_Click"/>

● 第02~06行代码定义了一个圆角的Border。

● 第08行的Grid使得可以接受拖放的图像。

● 第10~17行代码定义一个文本标签显示可拖动图像的信息。

● 第19行代码显示一个Image控件用来显示图像。

● 第23~30行代码定义了选择图像的按钮允许用户选择图像。

● 第32~37行代码定义了保存联系人的按钮。可以看到,基本上所有的按钮都使用了GlassButton模板。