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