一步一步学Silverlight 2系列(3):界面布局

概述

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

本文为系列文章第三篇,学习Silverlight 2中的界面布局,Silverlight 2中新增加了Grid和Panel两个布局容器,使得界面布局更加的强大和灵活。

Canvas面板

Canvas是在Silverlight 1.0时代就有的一种基础布局面板,它采用绝对坐标定位。可以使用附加属性(Attached Property)对Canvas中的元素进行定位,通过附加属性我们指定控件相对于其直接父容器Canvas 控件的上、下、左、右坐标的位置。如下面的XAML声明了两个矩形,它们分别相对于父容器Canvas的左边距是50,相对于父容器Canvas的上边距分别是50和150:

TerryLee_Silverlight2_0020

运行后界面的效果如下所示:

TerryLee_Silverlight2_0021

除了上面我们用到的Canvas.Top和Canvas.Left两个附加属性外,还有一个Canvas.ZIndex附加属性。如果指定了两个控件相对于父容器Canvas同样的边距,则后面声明的控件父覆盖前面声明的控件。这时我们可以使用Canvas.ZIndex属性来改变它们的显示顺序,如下面的XAML声明:

<Canvas Background="#46461F">
    <Rectangle Fill="#0099FF" Width="160" Height="80"
               Canvas.Top="100" Canvas.Left="100">
    
    <Rectangle Fill="#FF9900" Width="160" Height="80"
             Canvas.Top="100" Canvas.Left="100"/>
</Canvas>

指定两个矩形相对于父容器Canvas的边距相同,这时默认的后声明的橙色矩形会覆盖蓝色矩形:

TerryLee_Silverlight2_0023

指定Canvas.ZIndex为1

<Canvas Background="#46461F">
    <Rectangle Fill="#0099FF" Width="160" Height="80"
               Canvas.Top="100" Canvas.Left="100" Canvas.ZIndex="1"/>
    
    <Rectangle Fill="#FF9900" Width="160" Height="80"
             Canvas.Top="100" Canvas.Left="100"/>
</Canvas>

将会让蓝色矩形显示在上面,值最大的显示在最上面:

TerryLee_Silverlight2_0024

StackPanel

StackPanel支持用行或列的方式来进行页面布局,默认情况下所有的子元素会垂直的排列显示,如下面的XAML声明三个矩形:

<StackPanel Background="#46461F">
    <Rectangle Fill="#0099FF" Stroke="White"
               Width="100" Height="50" Margin="10"/>
    <Rectangle Fill="#0099FF" Stroke="White"
               Width="100" Height="50" Margin="10"/>
    <Rectangle Fill="#0099FF" Stroke="White"
               Width="100" Height="50" Margin="10"/>
</StackPanel>

运行后在界面显示效果如下:

TerryLee_Silverlight2_0025

当然我们也可以指定为水平排列,通过Orientation属性指定:

<StackPanel Background="#46461F" Orientation="Horizontal">
    <Rectangle Fill="#0099FF" Stroke="White"
               Width="100" Height="50" Margin="10"/>
    <Rectangle Fill="#0099FF" Stroke="White"
               Width="100" Height="50" Margin="10"/>
    <Rectangle Fill="#0099FF" Stroke="White"
               Width="100" Height="50" Margin="10"/>
</StackPanel>

运行后界面显示效果如下:

TerryLee_Silverlight2_0026

在这里为了让各个控件之间有一定的距离,使用了Margin属性,该属性类似于HTML中的Margin。

Grid

Grid控件类似与HTML中的Table,只不过子元素不用放在单元格中。通过<Grid.RowDefinitions> 和 <Grid.ColumnDefinitions>来定义Grid的行和列,使用Grid.Row和Grid.Column两个附加属性指定子元素在Grid中显示的位置,这是一种非常灵活的布局方式。如下面的XAML声明:

<Grid x:Name="LayoutRoot" Background="#46461F" ShowGridLines="True">
    <Grid.RowDefinitions>
        <RowDefinition Height="120"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0" Text="UserName:" VerticalAlignment="Center" Foreground="White"></TextBlock>
    <TextBlock Grid.Row="1" Grid.Column="0" Text="Password:" VerticalAlignment="Center" Foreground="White"></TextBlock>
    <TextBox Grid.Row="0" Grid.Column="1" Width="200" Height="30" HorizontalAlignment="Left"></TextBox>
    <TextBox Grid.Row="1" Grid.Column="1" Width="200" Height="30" HorizontalAlignment="Left"></TextBox>
</Grid>

定义一个两行两列的Grid,做一个简单的用户登录的布局,为了明显起见,把ShowGridLines属性设为True,以便能够显示出边框线。同时,我们指定了第一行的高度为120,而第二行的则是剩余的高度,用*来指定。运行后效果如下:

TerryLee_Silverlight2_0027

综合实例

分别了解了上面的三个布局控件,接下来我们看一个综合实例,如何完成如下的一个取色器:

TerryLee_Silverlight2_0028

首先我们添加一个两行两列的Grid控件,分别指定行高和列宽:

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="260" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="120" />
        <RowDefinition Height="120" />
    </Grid.RowDefinitions>
</Grid>

添加颜色显示区域,用一个矩形显示,放入Grid的第0行第1列:

<Rectangle Grid.Row="0" Grid.Column="1" x:Name="PreviewColor"
                   Fill="#FF6600" Margin="10" Stroke="#666666" StrokeThickness="2" />

再添加颜色值显示区,嵌套一个StackPanel控件,让它里面的子控件垂直显示:

<StackPanel Grid.Row="1" Grid.Column="1" >
    <TextBlock FontSize="12">Color</TextBlock>
    <TextBox x:Name="HexColor" Width="160" Height="30" Text="#FF6600" Margin="10,5" FontSize="11"/>
</StackPanel>

左边用四个Silder控件和四个TextBlock控件显示,需要对Grid的行进行合并Grid.RowSpan属性:

<StackPanel Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" VerticalAlignment="Center">
   <TextBlock Text="Alpha" FontSize="12" Margin="10,15,0,0"/>
   <Slider x:Name="AlphaSlider" Margin="20,0,10,0" Maximum="255" Value="255" ValueChanged="RedSlider_ValueChanged"/>
   <TextBlock Text="Red" FontSize="12" Margin="10,15,0,0"/>
   <Slider x:Name="RedSlider" Margin="20,0,10,0" Maximum="255" Value="255" ValueChanged="RedSlider_ValueChanged"/>
   <TextBlock Text="Green" FontSize="12" Margin="10,15,0,0"/>
   <Slider x:Name="GreenSlider" Margin="20,0,10,0" Maximum="255" Value="102" ValueChanged="RedSlider_ValueChanged"/>
   <TextBlock Text="Blue" FontSize="12" Margin="10,15,0,0"/>
   <Slider x:Name="BlueSlider" Margin="20,0,10,0" Maximum="255" Value="0" ValueChanged="RedSlider_ValueChanged"/>
</StackPanel>

这样我们就完成了上面这样相对复杂的界面布局,对Slider控件添加事件处理程序:

private void RedSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    Color color = Color.FromArgb((byte)AlphaSlider.Value, (byte)RedSlider.Value, (byte)GreenSlider.Value, (byte)BlueSlider.Value);

    PreviewColor.Fill = new SolidColorBrush(color);
    HexColor.Text = color.ToString();
}
运行后,可以选取不同的颜色值:

TerryLee_Silverlight2_0029

结束语

关于界面布局就说到这里,在Silverlight 2中,通过上面的三种布局控件相结合,可以进行非常强大和灵活的界面布局。

下一篇:一步一步学Silverlight 2系列(4):鼠标事件处理

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
标签: Silverlight, XAML
posted @ 2008-03-07 21:27 TerryLee 阅读(39117) 评论(97) 编辑 收藏

 回复 引用 查看   
#1楼 2008-03-07 22:12 生鱼片      
跟着这系列学习了
 回复 引用 查看   
#2楼[楼主] 2008-03-07 22:22 TerryLee      
@生鱼片
呵呵,我也是利用这个周末好好看看,争取多写几篇出来:)

 回复 引用   
#3楼 2008-03-20 14:20 Ben@[未注册用户]
为什么不能直接从Toolbox中拖放控件?
 回复 引用 查看   
#4楼[楼主] 2008-03-20 18:21 TerryLee      
@Ben@
目前Beta 1不支持,但是可以拖动到Toolbox中

 回复 引用   
#5楼 2008-03-24 15:59 *o*[未注册用户]
GRID空件是放在USERCONTROL中的吗?
 回复 引用   
#6楼 2008-03-24 16:09 *o*[未注册用户]
你好
我想问下怎么我预览在浏览器中是什么也不显示呢?

 回复 引用 查看   
#7楼[楼主] 2008-03-24 21:17 TerryLee      
@*o*
是的

 回复 引用 查看   
#8楼[楼主] 2008-03-24 21:18 TerryLee      
@*o*
什么代码在浏览器中没有显示?

 回复 引用 查看   
#9楼 2008-03-25 12:49 romce      
学习。。。。
 回复 引用 查看   
#10楼[楼主] 2008-03-25 22:21 TerryLee      
@romce
:)

 回复 引用   
#11楼 2008-03-26 13:50 jerrywang[未注册用户]
加入Slider部分的代码后,页面显示一片空白。
还有为什么每次刷新页面都会向search.microsoft.com发送数据?

 回复 引用   
#12楼 2008-03-27 12:30 *o*[未注册用户]
谢谢你的帮助 仔细看了下 解决了问题
 回复 引用   
#13楼 2008-04-06 16:03 樱山飞雪[未注册用户]
NICE! 好好学习了
 回复 引用   
#14楼 2008-04-14 17:10 juliankim[未注册用户]
有一个问题 怎么才能让slider在拖动时实时显示其tooltip?
找来找去没找到方法,鼠标按下去tooltip就消失了,望楼主赐教。。

 回复 引用 查看   
#15楼 2008-04-23 18:30 aito      
--引用--------------------------------------------------
*o*: 你好
我想问下怎么我预览在浏览器中是什么也不显示呢?
--------------------------------------------------------
--引用--------------------------------------------------
TerryLee: @*o*
是的
--------------------------------------------------------
楼主你的效果不是在流览器流览的么?怎么我的流览也是什么都看不到的?是不是代码放错了地方了?

 回复 引用 查看   
#16楼 2008-04-24 09:54 外城      
学习了!
 回复 引用   
#17楼 2008-05-30 17:57 wxj[未注册用户]
--引用--------------------------------------------------
jerrywang: 加入Slider部分的代码后,页面显示一片空白。
还有为什么每次刷新页面都会向search.microsoft.com发送数据?
--------------------------------------------------------
我的也是,请问你是怎么解决的?谢谢

 回复 引用 查看   
#18楼 2008-06-11 12:53 小牛大牛      
不喜欢Grid的定义行和列的方式,直接用Html那种方式不好得很吗??
把行定义和列定义单独分开,看着多别扭.我要想弄个东西,还得先看行号和列号是多少,不爽,极不爽!
楼主很棒,学习中!

 回复 引用 查看   
#19楼 2008-06-16 23:30 房客      
我提个问题:
我在写代码时不小心写成这样:
<Slider x:Name="AlphaSlider" Maximum="255" Minimum="255" Margin="20,10" ValueChanged="Slider_ValueChanged"></Slider>
就是把Minimum属性赋值了,在调试的时候,就触发了ValueChanged事件了。这是为何?
如果说初始指定Minimum会触发ValueChanged,那为何指定Maximum却不会触发ValueChanged?
vs2008 sp1 + silverlist2.0 beat2


 回复 引用 查看   
#20楼 2008-06-16 23:38 房客      
调试了下,找到原因了。
应该是slider的默认的value是0,当设置minimum的值不为0时,将更改其value为minimum。这时会触发valuechanged.
因为我不指定minimum时,去指定默认value时也会触发valuechanged,如下代码:
<Slider x:Name="AlphaSlider" Maximum="255" Minimum="0" Value="10" Margin="20,10" ValueChanged="Slider_ValueChanged"></Slider>

事件的先后顺序应该是设置slider的value,会同时发生于构造slider。
这时,就会出现一个问题,事件先后顺序的问题。
一般情况下,指定slider默认值是很普通的事情。这时去触发valuechanged的事件时,由于slider还未构造完成,没有呈现在控件中,触发了valuechanged的事件,一旦在valuechanged的事件处理方法中,引用了slider实例,就会出现对象尚未实例化的错误。

不知道这是不是一个bug.

 回复 引用   
#21楼 2008-06-23 17:01 Zhang Peng[未注册用户]
我不知道为什么,按照上面的代码,在我的机器上总是valueChanged事件在实例化slider之前被调用,因而总报null错误.
我的处理方式是在valueChanged方法中加入判断.
不知道这个原因是如何引起的,是因为我用的Silverlight Beta 2吗?

 回复 引用   
#22楼 2008-06-23 18:33 Wang-JF[未注册用户]
找到原因了,和Maximum,Minimum无关,楼主的代码中4个RedSlider都有设置Value,如Value="102",这个在silverlight2下会触发RedSlider_ValueChanged事件,从而导致NULL的异常,只要在xaml设计页,拿掉value的赋值即可
 回复 引用   
#23楼 2008-06-23 18:34 Wang-JF[未注册用户]
补充是silverlight2 beta2 !
beta1没试过

 回复 引用 查看   
#24楼 2008-07-05 15:41 郑州-袁金辉      
--引用--------------------------------------------------
Wang-JF: 找到原因了,和Maximum,Minimum无关,楼主的代码中4个RedSlider都有设置Value,如Value=&quot;102&quot;,这个在silverlight2下会触发RedSlider_ValueChanged事件,从而导致NULL的异常,只要在xaml设计页,拿掉value的赋值即可
--------------------------------------------------------
遇到了同样的问题,用此方法解决了,多谢

 回复 引用 查看   
#25楼[楼主] 2008-07-06 22:16 TerryLee      
@郑州-袁金辉
@Wang-JF
我这个例子是在Beta 1下面写的!

 回复 引用 查看   
#26楼 2008-07-14 20:37 Kenny tian      
不知道大家这个问题是怎么解决的,Color框里的值是#00009A00

最前面两位是Alpha的值,怎么去掉?

 回复 引用   
#27楼 2008-07-18 17:32 StrongBird[未注册用户]
请教Terry一个问题:我用WPF XBAP工程就可以实现这些东西吗?请问SilverLight实现的和XBAP的有什么区别?
 回复 引用 查看   
#28楼[楼主] 2008-07-21 10:17 TerryLee      
@Kenny tian
为什么要去掉前两位呢?

 回复 引用 查看   
#29楼[楼主] 2008-07-21 10:17 TerryLee      
@StrongBird
WPF跟这还不一样,Silverlight是WPF的一个子集,用于在Web上的实现

 回复 引用   
#30楼 2008-07-21 10:53 StrongBird[未注册用户]
@TerryLee
明白了,我的理解是Silverlight Runtime实际是一个精简版的framework(WPF 的子集),其职责相当于在Web页面中支持内嵌类似flash这样的RIA模型。
不知道我的理解正不正确,但是如果是这样的话,似乎Silverlight和它的前身代码WPF/E(WPF Everywhere)的定位还是有一定差距啊呵呵。

 回复 引用 查看   
#31楼 2008-07-25 14:29 不若相忘于江湖      
楼上各位正解。

 回复 引用 查看   
#32楼[楼主] 2008-07-27 21:25 TerryLee      
@StrongBird
Silverlight和WPF/E的定位哪儿有差距呢?能否详细说说

 回复 引用   
#33楼 2008-07-29 09:59 StrongBird[未注册用户]
--引用--------------------------------------------------
TerryLee: @StrongBird
Silverlight和WPF/E的定位哪儿有差距呢?能否详细说说
--------------------------------------------------------
因为我觉得WPF/E的定位更广阔,Silverlight看起来更像是一个针对浏览器的插件而已,虽然这个插件因拥有.NET平台技术为依托而显得比Flash强大得多。就我个人对WPF/E的定位理解而言,它是一个智能客户端在Client的最精简的部署模型,其用意不光旨在browser。

 回复 引用 查看   
#34楼[楼主] 2008-07-30 00:54 TerryLee      
@StrongBird
其实我觉的WPF/E到Silverlight没有什么定位上的差别,WPF/E仅仅是一个代码名而已。

 回复 引用   
#35楼 2008-08-05 12:02 nakupanda[未注册用户]
TerryLee大侠,用Grid布局显示表格线时,默认的是虚线并且四边没有,如何设置才能做到html中table那样的效果呢
 回复 引用 查看   
#36楼[楼主] 2008-08-06 13:22 TerryLee      
@nakupanda
似乎使用目前的Grid控件无法实现:(

 回复 引用 查看   
#37楼 2008-08-18 13:16 汉城      
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
}

private void RedSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
Color color = Color.FromArgb((byte)AlphaSlider.Value, (byte)RedSlider.Value, (byte)GreenSlider.Value, (byte)BlueSlider.Value);

PreviewColor.Fill = new SolidColorBrush(color);
HexColor.Text = color.ToString();

}
}

为什么运行不过去。。
AlphaSlider.Value 为空值

 回复 引用   
#38楼 2008-08-18 23:28 cocowool[未注册用户]
@汉城
我也遇到这个问题sl2

 回复 引用 查看   
#39楼[楼主] 2008-08-20 10:19 TerryLee      
@汉城
@cocowool
是运行时报这个错误还是编译时?

 回复 引用   
#40楼 2008-08-21 18:14 snows[未注册用户]
@汉城
@cocowool
beta 2 的Silverlight 不能给value初值,给了就会抛异常

 回复 引用   
#41楼 2008-08-30 23:01 Eithday[未注册用户]
public partial class Page : UserControl
{
bool isInit = false;

public Page()
{
InitializeComponent();
isInit = True;
}

private void RedSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (!isInit)
{
return;
}
Color color = Color.FromArgb((byte)AlphaSlider.Value, (byte)RedSlider.Value, (byte)GreenSlider.Value, (byte)BlueSlider.Value);

PreviewColor.Fill = new SolidColorBrush(color);
HexColor.Text = color.ToString();

}
}

这样就可以了!

 回复 引用   
#42楼 2008-09-28 16:43 yjh4866[未注册用户]
四个滑块用的一个函数,只有最后一个不会出错
 回复 引用 查看   
#43楼 2008-10-09 13:32 陈漠      
为什么不能赋给初始值??不是很理解,刚学习中。
 回复 引用   
#44楼 2008-10-22 00:02 straybird[未注册用户]
4个Silder控件ValueChanged 触发时间很奇怪,导致null错误。
我在构造函数里加入事件注册就可以解决问题

public Page()
{
InitializeComponent();
AlphaSlider.ValueChanged += RedSlider_ValueChanged;
RedSlider.ValueChanged += RedSlider_ValueChanged;
GreenSlider.ValueChanged += RedSlider_ValueChanged;
BlueSlider.ValueChanged += RedSlider_ValueChanged;
}


 回复 引用 查看   
#45楼 2008-10-28 14:38 燕山又飘雪      
其实四个slider应该是分别调用自己的change事件,分别改一下就行了,
还有楼上的一位也提到了,我也遇到这样的问题了,把楼主写的每个slider的value="" 去掉就可以了,这样运行起来就没有错误了,欢迎和大家交流

 回复 引用 查看   
#46楼[楼主] 2008-10-28 15:25 TerryLee      
@燕山又飘雪
跟调用各自的Changed事件没关系,主要是Beta 2中发生了一些变化。

 回复 引用   
#47楼 2008-11-01 20:06 lings[未注册用户]
我在练习这个 例子的时候
VS2008 无法识别 Color,我查了下 MSDN ,
Color 的命名空间是 System.Drawing
我的版本是 Silverlight 2 Beta 2 SDK
却无 System.Drawing.dll 文件
是不是 Silverlight 把它封装在别的 .dll 里面了?
各位 SL 米们,你们这个例子 是否能顺利编译了?
帮帮忙看下这个问题,好郁闷滴~
(今天装了 Silverlight 正式版的 SDK,VS2008 和 Expression Blend 却受牵连,连 SL 都不认了,没办法,只能用回 Beta2,但 正式版 10月份才出的, 这个 例子出现在 今年 3月份,不可能 是 SDK的问题吧?)
天啊!



 回复 引用 查看   
#48楼[楼主] 2008-11-05 09:44 TerryLee      
@lings
正式版,发生了极大的变化,这个例子是Beta 1的。

 回复 引用   
#49楼 2008-11-19 09:53 cityvoice[未注册用户]
你好,我现在用blend2 sp1开发,用你上面的例子。
AlphaSlider.Value,HexColor.Text等都取不到值,会报错,我在其它开发中也遇到同样的情况,就是如果直接用x:Name属性值来作为对象调用,好像取不到这个对象,不知道我这样是否表达清楚?我刚学习silverlight,敬请指导

 回复 引用 查看   
#50楼[楼主] 2008-11-19 23:42 TerryLee      
@cityvoice
那就是你的环境有问题了,使用x:Name肯定能找到对象:)

 回复 引用   
#51楼 2008-11-21 16:25 cute[未注册用户]
刚开始学习,感谢博主的文章
 回复 引用 查看   
#52楼[楼主] 2008-11-21 23:57 TerryLee      
@cute
客气了:)

 回复 引用   
#53楼 2008-12-09 21:54 yilei[未注册用户]
楼主:
我的运行完 ,就停在100%(读取的那个圈圈)那不动了是什么情况?
程序代码都没问题

 回复 引用   
#54楼 2008-12-15 00:32 absolute1000[未注册用户]
@yilei

你进行程序调试就会发现:
如果在设计时为Slider指定ValueChanged,则在页面呈现之前,如果Slider的Value不为0时引发就会进发事件ValueChanged,且此时AlphaSlider等均为null,而如果在页面构造函数中指定ValueChanged,则在页面呈现过程中不引发Slider的ValueChanged。解决方法:
1.时间处理函数该为
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (AlphaSlider == null)
return;

Color color = Color.FromArgb((byte)AlphaSlider.Value, (byte)RedSlider.Value, (byte)GreenSlider.Value, (byte)BlueSlider.Value);

PreviewColor.Fill = new SolidColorBrush(color);
HexColor.Text = color.ToString();

}
2.在设计页面中不指定ValueChanged,而在页面构造函数中指定

this.AlphaSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(Slider_ValueChanged);
this.RedSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(Slider_ValueChanged);
this.GreenSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(Slider_ValueChanged);
this.BlueSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(Slider_ValueChanged);

 回复 引用 查看   
#55楼[楼主] 2008-12-15 11:23 TerryLee      
@yilei
运行完了一直保持在100%,说明你的程序出错了:)

absolute1000的回答应该可以解决你的问题。

 回复 引用 查看   
#56楼 2008-12-27 15:17 IT问客      
楼主好,感谢你提供的珍贵资源,我是个大四应届生,我现在在做地理信息系统毕业设计..楼主现在silverlight2正式版本了,能说说他们的区别吗?我现在在用silverlight2正式+vs2008 sp1
 回复 引用   
#57楼 2008-12-31 17:26 rakor[未注册用户]
按LZ写的代码运行后,页面上只有一个圆圈不停地在转,没有文章中图片里的东西,请问是哪里的问题?

我用的是silverlight2正式版+vs2008 sp1。

 回复 引用 查看   
#58楼[楼主] 2009-01-04 11:28 TerryLee      
@IT问客
哪个跟哪个的区别?在Silverlight 2正式版的文档中,有一篇文章专门介绍Silverlight 2 Beta 2和Silverlight 2 RTW的区别。

 回复 引用 查看   
#59楼[楼主] 2009-01-04 11:29 TerryLee      
@rakor
出现那样的界面,说明你的程序出错了,看一下上面的评论,有几种可能出错的情况。

 回复 引用   
#60楼 2009-01-21 16:43 游客512[未注册用户]
@absolute1000
经典,分析得非常透彻!

 回复 引用 查看   
#61楼 2009-02-06 11:42 咸鱼翻身      
事件应该在InitializeComponent();后添加
this.AlphaSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(AlphaSlider_ValueChanged);
this.RedSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(AlphaSlider_ValueChanged);
this.GreenSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(AlphaSlider_ValueChanged);
this.BlueSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(AlphaSlider_ValueChanged);
否则会出现滑动条为空的异常。
不知道是否是版本问题。
这样处理就避免了异常。

 回复 引用   
#62楼 2009-04-13 09:51 afaand20[未注册用户]
private void RedSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
Color color = Color.FromArgb((byte)AlphaSlider.Value, (byte)RedSlider.Value, (byte)GreenSlider.Value, (byte)BlueSlider.Value);

PreviewColor.Fill = new SolidColorBrush(color);
HexColor.Text = color.ToString();
}
我添加这一段代码时(复制你写的)。出现错误。以前的操作都没有出现错误。说是AlphaSlider、RedSlider、GreenSlider、BlueSlider、PreviewColor、HexColor没有定义。请问为什么?怎么修改?

 回复 引用   
#63楼 2009-04-13 10:49 afaand20[未注册用户]
提示未将对象Color color = Color.FromArgb((byte)AlphaSlider.Value, (byte)RedSlider.Value, (byte)GreenSlider.Value, (byte)BlueSlider.Value);引用设置到对象的实例。但是并没有报错和警告,没有办法运行!请问怎么回事?

 回复 引用   
#64楼 2009-04-16 17:32 desperado[未注册用户]
加入一行代码,防止初始化时alphaSlider=null引起错误:
if (alphaSlider == null) return;

 回复 引用   
#65楼 2009-04-22 11:38 afaand20
@Eithday
这样改虽然可以编译通过了,并且可以显示,但是就是拖动滑条,颜色没有改变呀!

 回复 引用   
#66楼 2009-04-24 15:35 LoveSilverlight[未注册用户]
用 VS2008SP1+ Silverlight2 正式版的确会出现问题。加载页面之后,提示AlphaSlider为null,根据我的测试,就是由于XAML代码中设设置了Value属性造成的,一旦加载页面,就会引发RedSlider_ValueChanged事件!

解决的办法是不要在XAML中设置Slider的 Value属性,而在页面初始化完成之后,再设置Slider的初始值:
namespace SilverlightApplication4
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();

//设置Slider的初始值
AlphaSlider.Value = 255;
RedSlider.Value = 120;
GreenSlider.Value = 176;
BlueSlider.Value = 0;
}

......


这样比较自然。

 回复 引用   
#67楼 2009-04-30 17:16 新丁[未注册用户]
支持64楼

public Page()
{
InitializeComponent();
getColorValue();
}

private void getColorValue()
{
if (AlphaSlider == null || RedSlider == null || GreenSlider == null || BlueSlider == null) return;
Color color = Color.FromArgb((byte)AlphaSlider.Value, (byte)RedSlider.Value, (byte)GreenSlider.Value, (byte)BlueSlider.Value);
PreviewColor.Fill = new SolidColorBrush(color);
HexColor.Text = color.ToString();
}

private void RedSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
getColorValue();
}

 回复 引用   
#68楼 2009-06-17 15:59 林小
我现在用VS2010做SLIVERLIGHT做的,感觉上方便多了
 回复 引用   
#69楼 2009-07-03 11:22 龙骑士
刚开始学习Silverlight,terrylee资料好易懂 。。呵呵。谢谢楼主了。。
 回复 引用 查看   
#70楼 2009-07-15 15:45 晴天1848      
支持67楼!
 回复 引用 查看   
#71楼 2009-07-24 15:28 猛K赵云      
引用Eithday:public partial class Page : UserControl
<br/>{
<br/>bool isInit = false;
<br/>
<br/>public Page()
<br/>{
<br/>InitializeComponent();
<br/>isInit = True;
<br/>}
<br/>
<br/>private void RedSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
<br/>{
<br/>if (!isInit)
<br...

上面的代码是正解,感谢41楼了。

 回复 引用 查看   
#72楼 2009-07-29 17:37 AnDy.L      
41楼的代码是正解,非常感谢!
 回复 引用 查看   
#73楼 2009-08-12 23:09 郑希强      
右边的有些不能显示的的吧 宽度不够隐藏了
 回复 引用 查看   
#74楼 2009-10-13 14:28 殷良胜      
@郑希强
宽度可以自己随意调整呀 呵呵

 回复 引用 查看   
#75楼 2009-11-06 10:58 SmallRain      
a a fad fa fd
 回复 引用   
#76楼 2009-11-09 15:30 wujie[未注册用户]
1 silverlight3 开发有默认的mainPage.xaml ,可以直接运行。但是当我新创建一个xaml文件,运行后,显示的结果还是mainPage.xaml运行的结果。怎么回事?我需要怎么配置。在哪个文件中配置
 回复 引用 查看   
#77楼 2009-12-06 11:15 samudra.lee      
@wujie
App.xaml.cs 文件里的

private void Application_Startup(object sender, StartupEventArgs e)
{
this.RootVisual = new BasicControls();
}

new 后面设置启动页面。

 回复 引用 查看   
#78楼 2010-05-05 16:18 网微鸣      
写得不错!实例成功运行!
 回复 引用 查看   
#79楼 2010-05-14 17:19 mryan      
学习了

 回复 引用 查看   
#80楼 2010-06-29 07:21 Prince.Wei      
Thx, it's a very Great tutorial!
Go on!

 回复 引用 查看   
#81楼 2010-11-10 11:24 天上有云      
一步一步学习。。。谢谢了。。

columbia sportswear outlet | the north face outlet

 回复 引用 查看   
#82楼 2011-01-24 13:43 ょ_ +— 捻      
那个silverlight3.0怎么使用那个WatermarkedTextBox啊
 回复 引用 查看   
#83楼 2011-02-15 10:41 风从指尖飘过      
才学习,请问楼主有源代码没 ?
 回复 引用 查看   
#84楼 2011-03-31 17:02 starwar3      
那个找不到对象为空的原因是因为在页面Slider设置了VALUE值导致触发了事件,而页面还未加载完成,所以报错,把value值去了就OK了
 回复 引用 查看   
#85楼 2011-07-18 14:20 melody&bobo      
Silverlight4.0 问题依旧
页面加载前先执行了ValueChanged 异常了。。。

 回复 引用 查看   
#86楼 2011-10-25 15:16 褚德峰      
去掉那个value就可以了
 回复 引用 查看   
#87楼 2012-02-09 00:39 Ritchie(乞戈)      
@Wang-JF
SilverLight4也有这个问题。