学习做自定义控件的时候的一点补充总结 ,原文地址:
http://msdn.microsoft.com/zh-cn/magazine/cc721611.aspx,我用的是silverlight4,所以文中有些内容是要修改的。® Presentation Foundation (WPF) 控件模型的开发人员来讲,第一次构建 Silverlight 自定义控件会令人生畏。撰写此专栏时,即在发布 Silverlight 2 Beta 2 之前,几乎没有文档可供参考,而在 Web 中快速搜索出的少数几篇教程为我指明了方向。虽然我正在讨论此主题,但应该提醒大家的是,我正在使用的 Beta 2 在其最终发布之前,可能会做进一步的更改。

图 2 Page.xaml

图 4 修改后的控件声明
在了解如何为新平台编写自定义控件时,我经常先复制一些内置控件:按钮和列表框等等。这些控件可能表面看起来简单,但他们总是揭示了控件模型的关键功能并可以测试人们对这些功能的掌握程度。另外,如果您无法首先创建一个简单的按压按钮,则无法创建 super-duper-multicolor-multithreaded-all-in-one-do-it-all 小组件控件。
了解 Silverlight 2 自定义控件的最佳方法是一步一步一点一点地创建一个 Silverlight 2 自定义控件。这样,您不仅能了解控件的各个组成部分,还能了解它们是如何组合到一起的。以下教程描述了如何构建 SimpleButton 控件,该控件复制内置 Button 控件的外观和行为的重要方面,并且可以从该控件直接看到控件开发的情况,即 Silverlight 样式。
步骤 1:创建新的 Silverlight 项目
图 1 所示。当 Visual Studio 试图为 Silverlight 项目创建随附的 Web 项目时,选择“是”。
图 1 创建 SimpleButtonDemo 项目(单击图像可查看大图)
步骤 2:从控件(或 ContentControl)派生
下一步是添加代表此控件的 C# 类。至少,为了继承基本的控件功能,该控件类应从 Silverlight System.Windows.Controls.Control 类派生。但是,它也可以从 ContentControl 和 ItemsControl 等 Control 派生类派生。许多内置控件可以直接或间接从添加了 Content 属性的 ContentControl 派生,而该属性允许对控件的内容(如按压按钮表面上的内容)进行自定义。ListBox 控件则从 ItemsControl 派生,ItemsControl 可以实现用来向用户提供项目集合的控件的基本行为。因为我们要实现按钮,所以将从 ContentControl 派生。
使用 Visual Studio 中的“添加新项”命令为 SimpleButtonDemo 项目添加新 C# 类。将文件命名为 SimpleButton.cs。然后打开 SimpleButton.cs 并修改 SimpleButton 类,这样它就可以从 ContentControl 派生:
namespace SimpleButtonDemo
{
public class SimpleButton : ContentControl
{
}
{
public class SimpleButton : ContentControl
{
}
}
此时,您已实现了单纯的自定义控件,该控件可在 XAML 文档中通过声明进行实例化。为了说明此问题,将下列语句添加到 Page.xaml:
<custom:SimpleButton />
具体位置是<grid></grid>之间。
您可以看到,clr-namespace 能够识别在其中定义 SimpleButton 类的命名空间,而程序集可以识别包含此控件的程序集。在此示例中,控件程序集和应用程序程序集是同一个程序集。如果 SimpleButton 在名为 MyControls.dll 的单独程序集中实现,您需要将程序集设为与“MyControls”相同。图 2 中的代码显示了完成上述修改后的 Page.xaml 的内容。顺便说一下,您不必将 custom 作为自定义控件的前缀;只需直接使用 foo 或贵公司的名称作为前缀即可。
<UserControl x:Class="SimpleButtonDemo.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:SimpleButtonDemo;assembly=SimpleButtonDemo"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<custom:SimpleButton />
</Grid>
</UserControl>
图 3 显示了 SimpleButtonDemoTestPage.html 在浏览器中的外观。当然,目前主页中还没有什么内容,但在下一步骤中情况将有所变化。
图 3 显示 SimpleButton 控件(单击图像可查看大图)
步骤 3:创建控件模板
图 4 中的代码显示了修改后的控件声明。
<custom:SimpleButton>
<custom:SimpleButton.Template>
<ControlTemplate>
<Grid x:Name="RootElement">
<Rectangle x:Name="BodyElement" Width="200" Height="100"
Fill="Lavender" Stroke="Purple" RadiusX="16" RadiusY="16" />
<TextBlock Text="Click Me" HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</custom:SimpleButton.Template>
</custom:SimpleButton><custom:SimpleButton.Template>
<ControlTemplate>
<Grid x:Name="RootElement">
<Rectangle x:Name="BodyElement" Width="200" Height="100"
Fill="Lavender" Stroke="Purple" RadiusX="16" RadiusY="16" />
<TextBlock Text="Click Me" HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</custom:SimpleButton.Template>
图 5)。现在,SimpleButton 具有了外观!
图 5 SimpleButton 控件(单击图像可查看大图)
步骤 4:创建默认控件模板
图 4 中的模板)将其覆盖,但如果不要求提供模板,您的控件会更加吸引人。
用于为自定义控件定义默认模板的机制是从 WPF 借用的。首先,向控件项目添加名为 Generic.xaml 的文件。(是的,此文件必须命名为 Generic.xaml。大小写无关紧要,但文件名不能改变。)然后,在 Generic.xaml 中定义样式,该样式使用属性 setter 将值分配给控件的 Template 属性。Silverlight 运行时自动在控件程序集(Generic.xaml 作为数据源嵌入其中)中查找 Generic.xaml 并将样式应用到控件实例。除了定义默认模板外,此样式还可以将默认值分配给其他控件属性,如 Width 和 Height 属性。
图 5 中的控件的 Template 值相同。