本演练逐步讲解如何使用 Microsoft Expression Blend 创建 WPF 自定义按钮。
重要
Microsoft Expression Blend 的工作原理是生成可扩展应用程序标记语言(XAML),然后编译该语言以生成可执行程序。 如果宁愿直接使用 XAML,则还有另一个演练,它使用 XAML 和 Visual Studio(而不是 Blend)创建与此相同的应用程序。 有关详细信息,请参阅 使用 XAML 创建按钮。
下图显示了要创建的自定义按钮。
将形状转换为按钮
在本演练的第一部分中,您将创建按钮的自定义外观。 为此,首先将矩形转换为按钮。 然后,将其他形状添加到按钮的模板,创建更复杂的外观按钮。 为什么不从常规按钮开始并对其进行自定义? 因为按钮具有不需要的内置功能;对于自定义按钮,可以更轻松地从矩形开始。
在 Expression Blend 中创建新项目
启动 Expression Blend。 (单击“开始”,指向“所有程序”,指向“Microsoft Expression”,然后单击“Microsoft Expression Blend”。)
根据需要最大化应用程序。
在“文件”菜单上,单击“新建项目”。
选择 标准应用程序(.exe)。
将项目命名为
CustomButton
,然后按“确定”。
此时,你有一个空白的 WPF 项目。 可以按 F5 运行应用程序。 如预期的那样,应用程序仅包含一个空白窗口。 接下来,创建一个圆角矩形并将其转换为按钮。
将矩形转换为按钮
将窗口背景属性设置为黑色: 选择窗口,单击 属性选项卡,并将 Background 属性设置为
Black
。绘制一个矩形,大约是窗口上的按钮大小: 选择左侧工具面板中的矩形工具,然后将矩形拖到窗口上。
圆出矩形的角: 拖动矩形的控制点或直接设置 RadiusX 和 RadiusY 属性。 将 RadiusX 和 RadiusY 的值设置为 20。
将矩形更改为按钮: 选择矩形。 在“工具” 菜单上,单击 “创建按钮”。
指定样式/模板的范围: 将出现如下所示的对话框。
对于“资源名(关键字)”,请选择“全部应用”。 这会使生成的样式和按钮模板应用于按钮的所有对象。 对于“定义位置”,请选择“应用程序”。 这将使最终生成的样式和按钮模板在整个应用程序中生效。 在这两个框中设置值时,按钮样式和模板将应用于整个应用程序中的所有按钮,默认情况下,在应用程序中创建的任何按钮都将使用此模板。
编辑按钮模板
现在你有一个已被更改为按钮的矩形。 在本部分中,你将修改按钮的模板,并进一步自定义其外观。
编辑按钮模板以更改按钮外观
转到编辑模板视图: 若要进一步自定义按钮的外观,我们需要编辑按钮模板。 此模板是在将矩形转换为按钮时创建的。 若要编辑按钮模板,请右键单击该按钮,然后选择 编辑控件部件(模板),然后 编辑模板。
在模板编辑器中,请注意,按钮现在已分隔为 Rectangle 和 ContentPresenter。 ContentPresenter 用于显示按钮内的内容(例如,字符串“Button”)。 矩形和 ContentPresenter 都处于 Grid 内部。
矩形 的演示文稿中的
组件 更改模板组件的名称: 右键单击模板清单中的矩形,将 Rectangle 名称从“[Rectangle]”更改为“outerRectangle”,并将“[ContentPresenter]”更改为“myContentPresenter”。
修改矩形,使其内部为空心(如圆环): 选择 outerRectangle,并将 Fill 设置为“透明”,将 StrokeThickness 设置为 5。
然后将 Stroke 设置为模板将采用的颜色。 为此,请单击“笔划”旁的白色小框,选择“CustomExpression”,然后在对话框中键入“{TemplateBinding Background}”。
的颜色
创建内部矩形: 现在,创建另一个矩形(将其命名为“innerRectangle”),并将其对称放置在 outerRectangle 内部。 对于此类工作,你可能希望缩放以使按钮在编辑区域中变大。
注释
矩形看起来可能与图中的矩形不同(例如,它可能有圆角)。
将 ContentPresenter 移动到顶部: 此时,文本“Button”可能不再可见。 如果是这样,那是因为 innerRectangle 位于 myContentPresenter的顶部。 若要解决此问题,请将 myContentPresenter 拖到 innerRectangle下方。 重新定位矩形和 myContentPresenter,使其类似于下面这样。
注释
或者,也可以通过右键单击 myContentPresenter 并按“向前移动”将其置于顶层。
更改 innerRectangle 的外观: 将 RadiusX、RadiusY和 StrokeThickness 值设置为 20。 此外,使用自定义表达式“{TemplateBinding Background}”将 Fill 设置为模板的背景,并将 Stroke 设置为“透明”。 请注意,Fill 的 Stroke 和 的设置与 outerRectangle的设置相反。
添加顶部的玻璃层: 自定义按钮外观的最后一部分是添加玻璃层。 此玻璃层由第三个矩形组成。 由于玻璃将覆盖整个按钮,玻璃矩形在尺寸上类似于 outerRectangle。 因此,只需创建 outerRectangle的副本即可创建矩形。 突出显示 outerRectangle 并使用 CTRL+C 和 CTRL+V 创建副本。 将此新矩形命名为“glassCube”。
在需要时重新定位 glassCube:如果 glassCube 的位置尚未使其覆盖整个按钮,请将其拖动到位。
使 glassCube 的形状与 outerRectangle 略有不同: 更改 glassCube的属性。 首先将 RadiusX 和 RadiusY 属性更改为 10,将 StrokeThickness 更改为 2。
的外观设置
使 glassCube 看起来像玻璃:使用线性渐变将 设置为玻璃外观,该渐变为 75% 不透明,在 6 个大致均匀的间隔之间交替使用白色和透明颜色Fill。 下面是渐变停止点的设置内容:
渐变停止点 1:Alpha 值为 75% 的白色
渐变停止点 2:透明
渐变停止点 3:白色,Alpha 值为 75%
渐变停止点 4:透明
渐变停止点 5:Alpha 值为 75% 的白色
渐变停止点 6:透明
这呈现出一种“波纹”的玻璃外观。
的矩形
隐藏玻璃层: 现在你已经了解了玻璃层的外观,请转到 属性面板 的 外观窗格,并将不透明度设置为 0% 以隐藏它。 在前面的部分中,我们将使用属性触发器和事件来显示和操作玻璃层。
自定义按钮行为
此时,通过编辑按钮模板来自定义按钮的演示文稿,但按钮不会像典型的按钮那样对用户操作做出反应(例如,在鼠标悬停时更改外观、接收焦点和单击)。接下来的两个过程演示如何在自定义按钮中生成此类行为。 我们将从简单的属性触发器开始,然后添加事件触发器和动画。
设置属性触发器
创建新的属性触发器:选中 glassCube 后,单击“触发器”面板中的“+ 属性”(请参阅下一步后面的图)。 这会创建具有默认属性触发器的属性触发器。
使 IsMouseOver 成为触发器使用的属性: 将属性更改为 IsMouseOver。 当IsMouseOver属性为
true
(用户用鼠标指向按钮时)时,这将激活属性触发器。属性上设置触发器
IsMouseOver 为 glassCube 触发 100% 的不透明度:请注意“触发器记录已开启”(请参阅上图)。 这意味着,在记录开启期间对 glassCube 的属性值进行的任何更改都会成为在 为 IsMouseOver 时进行的操作
true
。 在记录期间,将 glassCube 的 Opacity 更改为 100%。现在创建了第一个属性触发器。 请注意,编辑器的“触发器”面板记录了 已更改为 100%Opacity。
按 F5 运行应用程序,并将鼠标指针移到按钮上和下移。 当鼠标悬停在按钮上时,您应该会看到玻璃层出现,而当指针离开时,玻璃层将消失。
IsMouseOver 触发笔划值更改:让我们将其他一些操作与 触发器关联IsMouseOver。 在记录继续进行期间,将所选内容从 glassCube 切换到 outerRectangle。 然后将 outerRectangle 的 Stroke 设置为自定义表达式“{DynamicResource {x:Static SystemColors.HighlightBrushKey}}”。 这会将 Stroke 设置为按钮使用的典型突出显示颜色。 将鼠标悬停在按钮上时,按 F5 查看效果。
IsMouseOver 触发模糊文本:让我们将另一个操作关联到 属性触发器IsMouseOver。 当玻璃出现在按钮上时,使按钮的内容显得有点模糊。 为此,我们可以将模糊 BitmapEffect 应用于 ContentPresenter(myContentPresenter)。
注释
若要将 “属性”面板 恢复到搜索 BitmapEffect之前的状态,请清除 搜索框中的文本。
此时,我们已使用具有多个关联操作的属性触发器来创建鼠标指针进入并离开按钮区域时的突出显示行为。 按钮的另一个典型行为是在它获得焦点时(如单击它后)突出显示。 可以通过为 IsFocused 属性添加另一个属性触发器来添加此类行为。
为 IsFocused 创建属性触发器: 使用与 IsMouseOver 相同的过程(请参阅本部分的第一步),为 IsFocused 属性创建另一个属性触发器。 在“触发器记录已开启”期间,将以下操作添加到触发器:
作为本演练的最后一步,我们将向按钮添加动画。 这些动画将由事件触发,特别是 MouseEnter 和 Click 事件。
使用事件触发器和动画添加交互性
创建 MouseEnter 事件触发器: 添加新的事件触发器,然后选择 MouseEnter 作为触发器中使用的事件。
创建动画时间线: 下一步,将动画时间线关联到 MouseEnter 事件。
按 “确定” 创建新时间线后,将显示 时间线面板,并且在设计面板中可以看到“已开启时间线录制”。 这意味着我们可以开始在时间线中记录属性更改(动画属性更改)。
注释
可能需要调整窗口和/或面板的大小才能看到显示内容。
创建关键帧: 若要创建动画,请选择要进行动画处理的对象,在时间线上创建两个或多个关键帧,并为这些关键帧设置要在其中内插动画的属性值。 下图指导你创建关键帧。
在此关键帧处缩小 glassCube:选择第二个关键帧后,使用“大小转换”将 glassCube 的大小缩小到其完整大小的 90%。
按 F5 运行应用程序。 将鼠标指针移到按钮上。 请注意,玻璃层在按钮顶部收缩。
创建另一个事件触发器并将其与它相关联: 让我们再添加一个动画。 使用与你用于创建上一个事件触发器动画的过程类似的程序:
结论
你已完成了自定义按钮。 使用应用于应用程序中所有按钮的按钮模板执行此操作。 如果保留模板编辑模式(请参阅下图),并创建更多按钮,则会看到它们的外观和行为类似于自定义按钮,而不是默认按钮。
按 F5 运行应用程序。 单击这些按钮,注意它们的行为方式都是相同的。
请记住,在自定义模板时,将 Fill 的 属性和 Stroke 属性 outerRectangle 设置为模板背景({TemplateBinding Background})。 因此,当你设置各个按钮的背景色时,你设置的背景将用于这些各自的属性。 立即尝试更改背景。 在下图中,使用了不同的渐变。 因此,虽然模板可用于整体自定义各种控件(例如按钮),但仍然可以对具有模板的控件进行修改,使其在外观上彼此不同。
总之,在自定义按钮模板的过程中,你已了解如何在 Microsoft Expression Blend 中执行以下操作:
自定义控件的外观。
设置属性触发器。 属性触发器非常有用,因为它们可用于大多数对象,而不仅仅是控件。
设置事件触发器。 事件触发器非常有用,因为它们可用于大多数对象,而不仅仅是控件。
创建动画。
杂项:创建渐变、添加 BitmapEffects、使用转换并设置对象的基本属性。