一步一步学Silverlight 2系列(10):使用用户控件

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。

本文为系列文章第10篇,主要介绍Silverlight 2中的用户控件使用。

创建用户控件

在Silverlight 2中,我们可以根据开发自定义控件或者创建用户控件,以达到控件重用的目的,添加一个新的用户控件:

TerryLee_Silverlight2_0049

编写用户控件实现代码:

<Grid x:Name="LayoutRoot" Background="White">
    <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
               Opacity="0.7" Fill="#FF8A8A8A"/>
    <Border CornerRadius="15" Width="400" Height="150" Background="LightPink" Opacity="0.9">
        <StackPanel Orientation="Horizontal" Height="50">
            <Image Source="info.png" Margin="10 0 0 0"></Image>
            <Button Background="Red" Width="120" Height="40" 
                    Content="OK" Margin="10 0 0 0" FontSize="18"/>
            <Button Background="Red" Width="120" Height="40" 
                    Content="Cancel" Margin="50 0 0 0" FontSize="18"/>
        </StackPanel>
    </Border>
</Grid>

在需要使用该用户控件的页面XAML中注册命名空间:

TerryLee_Silverlight2_0050

使用用户控件:

<Grid x:Name="LayoutRoot" Background="#46461F">
    <uc:ConfirmBox x:Name="mybox"></uc:ConfirmBox>
</Grid>

整个过程就这么简单,运行后效果如下:

TerryLee_Silverlight2_0051

为用户控件添加属性

简单的修改一下上面示例中的XAML文件,添加一个文本块控件,用它来显示文字提示信息。

<Grid x:Name="LayoutRoot" Background="White">
    <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
               Opacity="0.7" Fill="#FF8A8A8A"/>
    <Border CornerRadius="15" Width="400" Height="150" Background="LightPink" Opacity="0.9">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="60"></RowDefinition>
                <RowDefinition Height="90"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock x:Name="message" FontSize="18" Foreground="White"
                       HorizontalAlignment="Left" VerticalAlignment="Center"
                       Margin="50 20 0 0"/>
            <StackPanel Orientation="Horizontal" Height="50" Grid.Row="1">
                <Image Source="info.png" Margin="10 0 0 0"></Image>
                <Button Background="Red" Width="120" Height="40" 
                    Content="OK" Margin="10 0 0 0" FontSize="18"/>
                <Button Background="Red" Width="120" Height="40" 
                    Content="Cancel" Margin="50 0 0 0" FontSize="18"/>
            </StackPanel>
        </Grid>
    </Border>
</Grid>

定义属性:

public partial class ConfirmBox : UserControl
{
    public ConfirmBox()
    {
        InitializeComponent();
    }

    public String Message
    {
        get { return this.message.Text; }
        set { this.message.Text = value; }
    }
}

在页面使用用户控件的属性,XAML编辑器能够识别出属性并提示:

TerryLee_Silverlight2_0052

为ConfirmBox控件的Message属性赋值:

<Grid x:Name="LayoutRoot" Background="#46461F">
    <uc:ConfirmBox x:Name="mybox" Message="使用用户控件成功"></uc:ConfirmBox>
</Grid>

运行后效果如下所示:

TerryLee_Silverlight2_0053

动态添加用户控件

用户控件可以动态的添加到页面中,修改一下Page.xaml中的XAML代码,放入一个Canvas作为用户控件的容器。

<Grid x:Name="LayoutRoot" Background="#46461F">
    <Canvas x:Name="ContainerCanvas">
        
    </Canvas>
</Grid>

编写添加用户控件代码:

private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
    ConfirmBox confirmbox = new ConfirmBox();

    confirmbox.Message = "动态添加用户控件成功!";

    ContainerCanvas.Children.Add(confirmbox);
}

运行后效果如下所示,当然我们也可以控制用户控件显示的位置等。

TerryLee_Silverlight2_0054

结束语

本文简单介绍了在Silverlight 2中使用用户控件,包括创建用户控件、添加属性、动态添加用户控件等内容,你可以从这里下载本文示例代码。

下一篇:一步一步学Silverlight 2系列(11):数据绑定

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: Silverlight
posted @ 2008-03-08 20:36 TerryLee 阅读(11131) 评论(48)  编辑 收藏 网摘 所属分类: [03]  银光点亮世界

  回复  引用    
#1楼2008-03-08 23:15 | calm[未注册用户]
Terrylee大侠,怕在别的你看不到,占这个地方问你个与silverlight无关的问题:我现在是vista系统,请问可以同时安装IE7跟IE8吗?如果安装上IE8后有问题或者我不想用,可以重新切换到IE7吗?

谢谢

  回复  引用  查看    
#2楼[楼主]2008-03-08 23:22 | TerryLee      
@calm
可以安装,在IE8中带了切换到IE7的功能,如果不想用,也可以进行卸载。

参见http://www.cnblogs.com/JustinYoung/archive/2008/03/06/eyes-on-IE8.html" target="_new">http://www.cnblogs.com/JustinYoung/archive/2008/03/06/eyes-on-IE8.html

  回复  引用  查看    
#3楼2008-03-11 12:53 | 笑煞天      
为什么我添加的属性Blend2.5无法识别呢?
  回复  引用  查看    
#4楼[楼主]2008-03-11 13:21 | TerryLee      
@笑煞天
我在Blend2.5下没有测试,也许会有问题,添加属性在VS2008 XAML编辑器中是可以识别的:)

  回复  引用  查看    
#5楼2008-03-28 23:03 | 井号键      
Terrylee大侠,我在开发用户控件中遇到拉问题...
想请教一下:
在Silverlight1.1中使用用户控件时,控制用户控件的位置可以通过
setValues(Canvas.LeftProperty(TopProperty),double)这个方法来设置...但在2.0里面 原来的Canvas变成拉UserControl...也没有原来的LeftProperty这些属性..多拉MaxHeightProperty之类的4个属性...不知道原来那样的方法该怎么实现阿.

  回复  引用    
#6楼2008-04-02 21:43 | itmsn[未注册用户]
今天终于看到这拉。例子也一个一个做到这啦。
今天我还就是没有找到那个添加一个新的用户控件的地方,请教一下。

TO: itmsn

就是按照TerryLee的方法建立silverlight应用程序,之后会有两个工程,你就在solution View中的silverlightApplication这个工程上右击-〉add->new item->Silverlight 就有了

  回复  引用    
#8楼2008-07-30 14:23 | sl-fans[未注册用户]
Terrylee大侠,为什么我不能在自定义控件内添加事件响应呢,没有响应
ConfirmBox.xaml
-------------------
public ConfirmBox()
{
InitializeComponent();
this.OkButton.MouseLeftButtonDown += new MouseButtonEventHandler(OkButton_MouseLeftButtonDown);
this.CancalButton.MouseLeftButtonDown += new MouseButtonEventHandler(CancalButton_MouseLeftButtonDown);
}

void CancalButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.message.Text = "Cancel clicked";
}

void OkButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.message.Text = "OK clicked";
}

  回复  引用  查看    
#9楼[楼主]2008-07-31 01:14 | TerryLee      
@sl-fans
由于有事件路由,需要用委托。

  回复  引用  查看    
#10楼2008-08-02 08:31 | 孙长宇      
自己做了个Login控件,可是引用的时候不能设置x:Name属性值,调试信息如下:
Cannot specify both Name and x:Name attributes.
这我就不太懂了。
<tiscs:Login Margin="0,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="userLogin"/>
请教。

  回复  引用  查看    
#11楼[楼主]2008-08-03 22:22 | TerryLee      
@孙长宇
在WPF下面我好像见过这个问题,忘了是怎么解决的了,呵呵

把你的Login控件代码贴出来看看,也许可以发现点什么:)

  回复  引用  查看    
#12楼2008-09-11 15:47 | 排骨面      
大大,怎样写一个控件,直接从TextBox控件继承??现在Silverlight的TextBox只有微软拼音输入法才能输出正确的结果, 我想自己写一个继承的TextBox.
  回复  引用  查看    
#13楼2008-09-12 16:06 | 排骨面      
哈哈,终于搞定了! 要这样做:
增加一个Silverlight 自定义控件,命名为ExtendTextBox.

把Xaml给成这样:
<TextBox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"" target="_new">http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"" target="_new">http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Drawer.ExtendTextBox"
>
</TextBox>

也就是说,把其中的UserControl等等东西全部去掉,换成这个。

然后再把后面的继承改了,就可以了。

public partial class ExtendTextBox : TextBox


  回复  引用  查看    
#14楼2008-09-12 16:10 | 排骨面      
不过,我又有问题了: 您现在推荐用Silverlight做项目吗??? 您有没有用她实际做过开发?

BTW: 中秋节快乐!!

  回复  引用    
#15楼2008-09-16 09:02 | pangmei[未注册用户]
李大哥,你得救救小妹的命啊.我做完这个后,用来做弹出对话框,但弹出来后是无模式的,后面的程序还接着运行,那有模式对话框怎样做啊,运行的时候阻塞进程之类的那种,先谢谢了.还有一个问题:我现在被公司分配用silverlight做聊天工具,有客户端与服务器端的那种,看了你的通信那部分,但很多的东西不明白.想跟李大哥要个详解之类的,或给个学习的资料之类的.先谢了!
  回复  引用  查看    
#16楼[楼主]2008-09-17 00:47 | TerryLee      
@排骨面
我现在正在使用Silverlight 2 Beta 2开发一个实际项目:)

  回复  引用  查看    
#17楼[楼主]2008-09-17 00:49 | TerryLee      
@pangmei
这方面可以使用Silverlight中的Socket通信来完成,有个老外写过几篇文章,你可以google一下:)

  回复  引用  查看    
#18楼2008-09-17 09:01 | 排骨面      
--引用--------------------------------------------------
TerryLee: @排骨面
我现在正在使用Silverlight 2 Beta 2开发一个实际项目:)
--------------------------------------------------------
那... 那个中文输入法的问题有吗?是不是自己重写这个控件解决的?
我就没有在网上看到一个完美的解决方案,总是有一点问题.. 郁闷坏了。
Release 啊 Release ,我望眼欲穿啊~~~~

  回复  引用    
#19楼2008-09-28 01:56 | 排骨面_的马甲[未注册用户]
最新消息!!

SL2 Rc0 正式版出来了!!!!


http://silverlight.net/GetStarted/sl2rc0.aspx

  回复  引用    
#20楼2008-10-05 16:12 | get[未注册用户]
李大师:我是silverlight2 beta2 在调用
<uc:ConfirmBox x:Name="mybox"></uc:ConfirmBox>
时,vs2008sp1不让我调,出错重起vs2008sp1

  回复  引用  查看    
#21楼[楼主]2008-10-08 11:32 | TerryLee      
@排骨面
我们给老外做项目,不会涉及到输入中文的问题,呵呵

另外,正式版马上就会发布!

  回复  引用  查看    
#22楼[楼主]2008-10-08 11:32 | TerryLee      
@get
有没有相应的错误信息啊

  回复  引用  查看    
#23楼2008-11-05 09:28 | zhaoliang      
怎么我在右击-〉add->new item->Silverlight 里面并没有silverlight user control这个选项..?
  回复  引用    
#24楼2008-11-13 11:17 | silver[未注册用户]
ContainerCanvas.Children.Add(confirmbox);
ContainerCanvas提示找不到。如何处理?

  回复  引用    
#25楼2008-11-13 11:41 | silver[未注册用户]
解决了是大小写问题,晕!!
  回复  引用  查看    
#26楼[楼主]2008-11-15 00:33 | TerryLee      
@silver
:)

  回复  引用    
#27楼2008-11-25 22:13 | 阿华007[未注册用户]
我安装的 Silverlight 2 正式版了,怎么没有新建议用户控件这个选项呢?只有应用程序和类库...
  回复  引用    
#28楼2008-11-26 11:41 | 阿排[未注册用户]
兄弟,我感觉是这样滴....

创建新项目的时候呢,就是应用程序和类库。
创建新项 的时候,就是用户控件了..

  回复  引用    
#29楼2008-11-27 16:32 | 阿华007[未注册用户]
@阿排
您说的是正确,搞定了,哈哈~

  回复  引用  查看    
#30楼[楼主]2008-11-30 23:58 | TerryLee      
@阿华007
@阿排
阿排的回答是正确的:)

  回复  引用  查看    
#31楼2008-12-08 16:46 | Z-Suker      
不知不觉已经学习完10章了,会军大哥你辛苦了!!!我一定会努力学习的,不能让你的辛苦浪费了挖哈哈哈~~~
  回复  引用  查看    
#32楼2008-12-09 09:24 | Z-Suker      
会军大哥,又来麻烦你了,我昨天想了很久,但是还是没能解决的问题,现在想请教下你~(*^_^*)
问题是,当在动态创建用户控件的时候怎么在private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)里把该控件的Canvas.Left属性加上啊,或者说怎么在创建时设定好布局啊????谢谢了~~~你给的例子创建好就只能处于左上角~~

  回复  引用  查看    
#33楼[楼主]2008-12-15 10:06 | TerryLee      
@Z-Suker
呵呵,谢谢:)

  回复  引用  查看    
#34楼[楼主]2008-12-15 10:06 | TerryLee      
@Z-Suker
设置Canvas.Left可以通过依赖属性来设置,调用SetValue方法即可

  回复  引用    
#35楼2008-12-17 14:49 | 小露[未注册用户]
To @Z-Suker

使用用户控件的时候如何控制它的布局,刚才尝试了下,有下列几种方法:

1。如果用户控件是加入到Grid中的,可以设置依赖属性Margin;

2。如果用户控件是加入到Canvas中的,可以设置依赖属性Canvas.Left & Canvas.Top;

3。还有一种最直接的方式,设置用户控件的RenderTransform,类似代码如下:

TranslateTransform tt = new TranslateTransform();
tt.X = 50;
tt.Y = 50;
MyUserControl.RenderTransform = tt;

:)

  回复  引用  查看    
#36楼[楼主]2008-12-19 01:35 | TerryLee      
@小露 1. 不是设置依赖属性Margin吧,应该是Grid.Row和Grid.Column 3. 使用TranslateTransform 布局不是一种好的做法、。
  回复  引用    
#37楼2009-03-05 13:56 | joryjy
会军大哥 一直在学习你的教程 受益匪浅 ,可是最近遇到一个小的项目 就是拖拽的问题 http://www.rainman3.cite.ehime-u.ac.jp/RAINMAN/RainmanDemo/RainmanDemoTestPage.aspx 就是把左边的一个图标能够拖到右边的表格里 不知道该怎么做了 因为页面有点复杂 我不知道该怎么弄了 希望能得到你的指点 不胜感谢!
  回复  引用    
#38楼2009-04-21 15:44 | afaand20
<uc:ConfirmBox x:Name="mybox"></uc:ConfirmBox>显示出错;
The type 'Uc:ConfirmBox' was not found. Verify that you are not missing an assembly reference and that all referenced assemblies have been built.

  回复  引用    
#39楼2009-04-22 10:33 | WatermarkedTextBox[未注册用户]
@孙长宇

  回复  引用    
#40楼2009-06-21 21:13 | kanji[未注册用户]
Lee 大師,你好,是第二次留言了,之前問了爲什麽 VS 不能直接做 XAML 的傻問題,这个月都在您的BLOG逛来逛去,多亏您的指导,我现在能够编写一些简单的应用了,昨天刚研究好用户控件,还在代码里面写了添加一个控件的代码,同时惊讶发现 Children.Add 后,对原对象的更改原来可以直接体现在界面里啊(我估计这个发现比上面那个还傻)。可是亲爱的 Lee 兄,我若想要添加一组控件,不知如何做呢?

我做了一個用户控件叫做 Block,有一個属性叫做 Normal,下面的成功
Block RB= new Block();
RB.Normal= ".3483, 1";
SB.Children.Add(RB);

这下好了,因为程序需要越来越大,欲根据某数据建立数量不定而且均可控制的 Block

Block[] RBs = new Block[9];
RBs[从0到尾循环].Normal = ""; <<== 这句提示[未将对象引用设置到对象的实例。]
我欲撞墙……如果觉得太菜了可以不要理我~




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1096785




相关文章:

相关链接: