一步一步学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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: Silverlight,XAML
0
0
(请您对文章做出评价)
« 上一篇:一步一步学Silverlight 2系列(2):基本控件
» 下一篇:一步一步学Silverlight 2系列(4):鼠标事件处理
posted @ 2008-03-07 21:27 TerryLee 阅读(26473) 评论(87)  编辑 收藏 网摘 所属分类: [03]  银光点亮世界

  回复  引用  查看    
#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 后面设置启动页面。