柯于旺 · 更新于 2018-11-28 11:00:43

控件的属性、事件与样式资源

如何添加控件

添加控件的方式有多种,大家更喜欢下面哪一种呢?

  • 使用诸如 Blend for Visual Studio 或 Microsoft Visual Studio XAML 设计器的设计工具。
  • 在 Visual Studio XAML 编辑器中将控件添加到 XAML 代码中。
  • 在代码中添加控件。 注意:当应用运行时会看到你在代码中添加的控件,但在 Visual Studio XAML 设计器中看不到。

前面我们通过在工具箱拖住控件以及直接在写 XAML 代码来设置控件,在教程的后面,我们会看到在 C# 后台代码中添加控件。Blend 我们暂时还没有用到,不过其在绘制图形和动画上可谓非常强大和优秀。

设置控件的属性

控件的属性相比大家都已经会用了,一来可以直接在XAML中添加属性,二来可以在属性视图中添加和修改属性。

为控件添加事件

如果要添加和修改事件呢,同样在属性视图中,点击右上角的闪电图标即可。如果要添加 Click 事件,那么在 Click 的输入框中输入好事件名称后直接按 Enter 即可。此时 VS 就会自动跳转到 C# 后台代码中,第一个参数 sender 是对处理程序所附加的对象的应用,第二参数是事件数据,它通常在签名中显示为 e 参数。

private void btnSetStyle_Click(object sender, RoutedEventArgs e)
{
    Button b = (Button)sender;
    b.Height = 400;
    b.Width = 320;
}

上面的这段代码这会将所点击的 Button 的高设置为 400,宽设置为 320;除了这种方式外,也可以按如下操作,其中 btnSetStyle 是当前 Button 的名字:

private void btnSetStyle_Click(object sender, RoutedEventArgs e)
{
    btnSetStyle.Height = 400;
    btnSetStyle.Width = 320;
}

除此之外,我们也可以不在 XAML 中定义 Click 事件,按照如下操作也可以达到相同的效果,它会将两个事件相互关联。

public MainPage()
{
     this.InitializeComponent();
     btnSetStyle.Click += new RoutedEventHandler(btnSetStyle_Click);
}
private void btnSetStyle_Click(object sender, RoutedEventArgs e)
{
    btnSetStyle.Height = 400;
    btnSetStyle.Width = 320;
}

为控件设置样式资源

即便没有添加过资源,也不清楚什么是样式,没关系,想必大家都玩过 2048 吧。游戏中有许多方格,那这些方格的样式会不会一个个去定义呢,当然不是,可以直接用样式资源来定位到所有的 Button。

以下是一个基本样式,<Page.Resources/> 应该在最外层的 Grid 外面,和 AppBar 等位于同一级别。其内有一个 Style 样式,TargetType 指向目标控件,Property 为目标空间的具体属性名,其值用 Value 列出即可。后面的容器部分我们暂时不作考虑啦,后面都会讲解的。

<Page.Resources>
   <Style TargetType="Button">
      <Setter Property="FontWeight" Value="Bold"/>
      <Setter Property="FontSize" Value="40"/>
      <Setter Property="HorizontalAlignment" Value="Center"></Setter>
      <Setter Property="VerticalAlignment" Value="Center"></Setter>
      <Setter Property="Background" Value="Gray"></Setter>
      <Setter Property="Width" Value="100"></Setter>
      <Setter Property="Height" Value="100"></Setter>
      <Setter Property="Template">
          <Setter.Value>
              <ControlTemplate TargetType="Button">
                  <Grid x:Name="Grid" Background="Transparent">
                      <Border x:Name="Border" Width="{TemplateBinding Width}"  
                      Height="{TemplateBinding Height}" Background="{TemplateBinding  
                      Background}" >
                      <ContentPresenter x:Name="ContentPresenter"  
                      ContentTemplate="{TemplateBinding ContentTemplate}"  
                      Content="{TemplateBinding Content}" HorizontalAlignment="Center"  
                      VerticalAlignment="Center"/>
                       </Border>
                   </Grid>
               </ControlTemplate>
           </Setter.Value>
       </Setter>
    </Style>
</Page.Resources>

但是这里也有一个问题,如果我们有 10 个 Button 控件,却只想其中 8 个用到这些定义,另外 2 个想用另一种控件,那该怎么办呢?

将样式定义为资源,其实是有 2 中方式的。

一种就是直接用 Style 的 TargetType 属性来定义到所有的目标控件。

另一种则除了用 TargetType 属性外,还可以用 x:key 属性,然后再具体的控件中庸显式的关键字 StaticResource 来设置具体的 Style 属性。

<Page.Resources>     
     <Style TargetType="Button">              
         <Setter Property="FontStyle" Value="Oblique" />
         <Setter Property="FontSize" Value="20" />
         <Setter Property="BorderBrush" Value="Green" />
         <Setter Property="BorderThickness" Value="5" />
         <Setter Property="Foreground" Value="Orange" />
         <Setter Property="Height" Value="80"/>
         <Setter Property="Width" Value="160"/>
     </Style>
     <Style x:Key="OtherStyle" TargetType="Button">
         <Setter Property="FontStyle" Value="Italic" />
         <Setter Property="FontSize" Value="16" />
         <Setter Property="Foreground" Value="Lavender" />
         <Setter Property="Height" Value="160"/>
         <Setter Property="Width" Value="320"/>
         <Setter Property="Opacity" Value="0.2"/>
     </Style>                                                            
</Page.Resources>

具体效果见下图,其中 Opacity 属性为透明度。

大家都知道类可以继承,样式也是可以继承的。