星辰.Net技术社区论坛

首页 » .NET » Silverlight » 在Silverlight2中开发User Control(用户控件)
admin - 2008-6-6 14:15:00
在silverlight 2(Beta1) 中开发用户控件与我们以前在Webform中使用的方式基本上接近.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
下面是一个DEMO,用于执行一个简单的查询雇员信息的操作.运行结果如下图所示::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    首先我们要新建一个Silverlight Application , 名称为:SearchUserControl:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    在该项目中添加一个Silverlight User Control , 名称为:EmployeeSearch:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    然后我们在该用户控件的CS代码中添加一个类用于描述雇员信息,如下::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
public class EmployeeInfo:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public string EmployeeNo { get; set; }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public string EmployeeName { get; set; }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
      另外还有一个EmployeeNameEventArgs类,用于当点击查询时,将要查询的雇员姓名以事件:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
参数方式传递到Page页面中,如下::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
public class EmployeeNameEventArgs : EventArgs:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public string EmployeeName { get; set; }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
      到这里准备工作就绪,下面是相应的控件xaml代码,请将其粘贴到EmployeeSearch.xaml中::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
<Grid x:Name="LayoutRoot" Background="White">:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
<Grid.RowDefinitions>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
<RowDefinition Height="200" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
<RowDefinition Height="100" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
<RowDefinition Height="50" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
</Grid.RowDefinitions>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
<ListBox Margin="10" x:Name="EmployeeList"/>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
<StackPanel  Grid.Row="1" Margin="12">:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
<TextBlock>输入要查询的名称:</TextBlock>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
<TextBox x:Name="Search" Margin="10" Text="james" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
</StackPanel>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
<Button Margin ="10" Content="获取Employee信息" Grid.Row="2" Click="OnGetEmployee":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Width
="120" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
</Grid>
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
      然后将下面的cs代码复制到EmployeeSearch.xaml.cs中,相关内容参见注释::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
public partial class EmployeeSearch : System.Windows.Controls.UserControl:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
#region 使用依赖属性从PAGE页面传参到当前用户控件,详情参见Page.xaml页面:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public static DependencyProperty SearchEmployeeNameProperty =:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            DependencyProperty.Register(
"SearchEmployeeName", typeof(string),:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
typeof(EmployeeSearch), null);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public string SearchEmployeeName:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
get:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
return ((string)base.GetValue(SearchEmployeeNameProperty));:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
set:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
base.SetValue(SearchEmployeeNameProperty, value);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
#endregion:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
/// <summary>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
/// 声明查询单击事件:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
/// </summary>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    public event EventHandler<EmployeeNameEventArgs> SearchClick;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
public EmployeeSearch():“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        InitializeComponent();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
this.Loaded += OnLoaded;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
void OnLoaded(object sender, RoutedEventArgs e):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        Search.Text
= SearchEmployeeName;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
void OnGetEmployee(object o, EventArgs e):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
//当有事件绑定时(参见page.xaml中的 SearchClick="OnSearch" 属性):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        if (SearchClick != null):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            SearchEmployeeName
= Search.Text;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
//运行绑定的单击事件代码:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            SearchClick(this, new EmployeeNameEventArgs():“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                EmployeeName
= Search.Text:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            });:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//将ListBox的ItemsSource属性开放给Page页面,以便进行数据绑定:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    public System.Collections.IEnumerable ItemsSource:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
get:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
return EmployeeList.ItemsSource;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
set:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            EmployeeList.ItemsSource
= value;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    这样控件的开发就完成了,下面是在page.xaml中声明并设置这个控件相应属性的代码::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
<UserControl x:Class="SearchUserControl.Page":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    xmlns
="http://schemas.microsoft.com/client/2007":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Width
="400" Height="400" xmlns:local="clr-namespace:SearchUserControl">:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
<UserControl.Resources>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
<local:EmployeeInfo EmployeeName="王五" x:Key="myEmployee" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
</UserControl.Resources>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
<StackPanel  x:Name="LayoutRoot" Background="White">:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
<local:EmployeeSearch x:Name="SearchControl" SearchClick="OnSearch":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                SearchEmployeeName
= "{Binding EmployeeName}":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                DataContext
= "{StaticResource myEmployee}" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
<TextBlock x:Name="txtEmployeeName" Text="暂无" FontSize="16" Margin="10" TextAlignment="Center" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
</StackPanel>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
</UserControl>
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    其中的xmlns:local="clr-namespace:SearchUserControl"为控件的名空间的引用,类似于我们:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
以前写用户控件时的::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
<%@ Register TagPrefix="" Namespace="" Assembly="" %>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    而下面代码即是我们引用该控件并进行属性设置的声明::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
<local:EmployeeSearch x:Name="SearchControl" SearchClick="OnSearch":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                SearchEmployeeName
= "{Binding EmployeeName}":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                DataContext
= "{StaticResource myEmployee}" />
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    StaticResource myEmployee会使用本地绑定的静态资源中所指向的数据,如下::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
 
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
<UserControl.Resources>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
<local:EmployeeInfo EmployeeName="王五" x:Key="myEmployee" />:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
</UserControl.Resources>
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    这样就会将控件中的搜索框绑定到该初始值(资源)上.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    而下面就是实际运行这个控件执行查询操作时CS代码(page.xaml.cs)::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
void OnSearch(object sender, EmployeeNameEventArgs e):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    List
<string> employeeList = new List<string>();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
foreach (EmployeeInfo en in GetData(e.EmployeeName)):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        employeeList.Add(en.EmployeeNo
+ " " + en.EmployeeName);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    SearchControl.ItemsSource
= employeeList;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    txtEmployeeName.Text
= "查询有关 """ + SearchControl.SearchEmployeeName + """ Employee信息";:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
private List<EmployeeInfo> GetData(string value):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Dictionary
<string, string> employee = new Dictionary<string, string>(){  {"10001", "张三"},:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                                                            {
"10002", "李四"},:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                                                            {
"10003", "王五"},:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                                                            {
"10004", "马六"},:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                                                            {
"10005", "王大麻子"},:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                                                            {
"10006", "王宝强"},:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                                                            {
"10007", "王蛋蛋"},:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                                                            {
"10008", "王五强"}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                          };:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
return (from e in employee:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
where e.Value.Contains(value.Trim()):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            select
new EmployeeInfo:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                EmployeeNo
= e.Key,:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                EmployeeName
= e.Value:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            }).ToList();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    因为代码比较简单,基本上就是一个linq to object查询,所以就不多做说明了.
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹

附件: silverlight_usercontrol.rar
1
查看完整版本: 在Silverlight2中开发User Control(用户控件)