65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 模板入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.10/5 (29投票s)

2008年11月15日

CPOL

2分钟阅读

viewsIcon

119574

一篇介绍 WPF 模板的文章

引言

Windows Presentation Foundation 允许开发者完全改变控件的外观和感觉。这是通过使用控件模板来实现的。这意味着你可以将你的 Button 渲染成一个 Ellipse,当鼠标悬停在其上时,它的颜色会改变。实际上,这就是我们在本文中要做的。

为什么使用控件模板,而不是样式?

在之前的文章中,我们讨论了 WPF 中的样式。你可以查看这篇文章:Windows Presentation Foundation 样式简介

你可能会问,为什么不使用样式来改变控件的外观呢?样式可以改变控件的外观,但它们将依赖于控件本身提供的属性。这意味着你将无法将你的 Button 渲染成一个 Polygon。控件模板允许通过提供一个将被控件使用的模板来改变控件的外观。

创建一个圆形按钮

在本文中,我们将使用控件模板创建一个圆形 button。第一步是创建一个简单的 button 控件。以下是该代码:

<Button Content="Push Me!" >

这将会在 WPF 表单上创建一个非常简单的 button 控件。让我们为这个 button 创建一个模板。我们将把模板放在 App.xaml 文件中,以便在整个应用程序中使用它。

<ControlTemplate x:Key="buttonTemplate" TargetType="{x:Type Button}">      
        <Grid>
           <Ellipse Name="el1" Fill="Orange" Width="100" Height="100">            
           </Ellipse>                                     
        </Grid> 
</ControlTemplate> 

上面定义的控件模板非常简单!首先,一个唯一的键“buttonTemplate”被分配给控件模板。此外,模板的 TargetType 被设置为“Button”,这意味着该模板只能应用于 Button 控件。接下来,我们在 Grid 控件内定义一个 Ellipse。它是一个用橙色填充的简单 Ellipse

WPFControlTemplates_002.png

现在,让我们将模板应用于 Button 控件

<Button Content="Push Me!" Template="{StaticResource buttonTemplate}" 
	Click="Button_Clicked"></Button>

一旦你应用了控件模板,Button 将会改变它的显示方式,并被渲染成一个 Ellipse,如下所示:

上面的渲染有一个问题;Button 控件的内容,即“Push Me!”没有显示出来。让我们让它出现在 Ellipse 内部。ContentPresenter 控件可以用来显示 WPF 控件的内容。

<ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" 
	Content="{TemplateBinding Button.Content}" />

结果如下

WPFControlTemplates_002.png

我们还没有完成!让我们也为 Button 控件添加一个触发器,以便当鼠标悬停在其上时,它会改变 Ellipse 的颜色。

<ControlTemplate.Triggers>
          <Trigger Property="Button.IsMouseOver" Value="True">
            <Setter TargetName="el1" Property="Fill" Value="Yellow"/>
          </Trigger>
        </ControlTemplate.Triggers>

触发器在 Button.IsMouseOver 事件上触发。Setter 用于将 EllipseFill 属性更改为“Yellow”。现在,当你将鼠标悬停在 Ellipse 上时,它将从橙色变为黄色。

结论

WPF 控件模板是 WPF 框架的一个非常重要的特性。它允许你改变 WPF 控件的外观和感觉,并以完全不同的方式渲染它们,不同于它们的默认格式。

希望你喜欢这篇文章。祝你编码愉快!

历史

  • 2008年11月14日:初始版本
© . All rights reserved.