WindowsPhone中Grid StackPanel Canvas控件入门

最近在公司学习WindowsPhone8的开发,因为以前对Silverlight没有太多了解,所以有些东西真的是第一次接触。由于上次使用ListPicker的时候因为父控件的原因弄得很纠结,所以又一次对这几个控件做了一些了解。

 

1)Grid

所谓Grid,中文释义就是栅栏,网格。大家想一下围棋的棋盘就知道了。而在Grid中的每个格子可以调整长宽,并且设定每一个格子的样式等等。

在新建一个WindowsPhone8的项目之后,大家可以在自动生成的Grid边框上点击左键就可以将Grid分成不同的格子。

我把Grid分成了4行3列,所以xaml代码变成了这样:

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="124*"/>
                <ColumnDefinition Width="209*"/>
                <ColumnDefinition Width="123*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="91*"/>
                <RowDefinition Height="145*"/>
                <RowDefinition Height="165*"/>
                <RowDefinition Height="206*"/>
            </Grid.RowDefinitions>
        </Grid>

大家可能疑惑这个*是什么意思,在ColumnDefinitions里可以看到各个列是124* 209* 123*,它的意思是将屏幕的宽度按照124:209:123的比例分配给三列。行亦如是。而关于行列的长宽还有一点要说的,就是另外两个Auto和*,这两个大家可以在xaml文件最外部的Grid定义中看到:

    <!--LayoutRoot 是包含所有页面内容的根网格-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

这里的Height一个是Auto,一个是*, Auto表示这个格子的高会根据格子里的内容的高变化而变化,就像气球里的气多了它就变大,气少了就收缩一样;而直接一个*的意思是,这个格子将占有剩下的所有高度。假如高度为800,如果第一行占100,那我占700,第一行700,我只有100,属于一个给多少要多少的老好人。

再多说一个tip,每个格子放控件大家应该都会。但是如果要一个空间跨越两格甚至更多呢?如果有网页基础的朋友应该知道table里的span, 而在Grid的定义里也有columnspan和rowspan,只要在控件里定义一下:

<Button Content="Button"Grid.ColumnSpan="2"/>

 

页面的Button就会占有两格

好了,Grid就入门一下,其他的功能大家可以自己再研究一下!

2)StackPanel

顾名思义,Stack,栈,一个特点就是像叠罗汉似的一个压着一个。大家先看一个截图:

而它对应的xaml代码仅仅是:

<StackPanel>
                <Button Content="Button"/>
                <Button Content="Button"/>
                <Button Content="Button"/>
                <Button Content="Button"/>
            </StackPanel>

 

没有做任何设置,Button和它的小伙伴们就已经一个压着一个了。而在代码中,大家也可以对StackPanel的Children进行一些操作,我就不再细说。

 

3)Canvas

这个其实在一般的Wp开发中是不怎么用到的,但是既然也是一种容器类控件,就学了学顺便说一下,自己也印象深刻一点。

我刚刚定义了一个Canvas,然后在里面加上了两格图形:

XAML代码如下:

<Canvas>
                <Ellipse Name="MyEllip" Width="100" Height="200" Fill="Aqua" Canvas.Left="67" Canvas.Top="87"></Ellipse>
                <Rectangle Name="MyRect" Width="200" Height="200" Fill="AntiqueWhite" Canvas.Left="199" Canvas.Top="234"></Rectangle>
            </Canvas>

 

大家可以看到它的位置是由Canvas.Left和Canvas.Top决定的,分别表示控件距离父Canvas控件边框的像素。好的,如果现在我想在代码中移动Ellipse怎么办呢?

答案不是MyEllip.blabla 而是得通过Canvas的静态方法来实现。我拖了一个Button上去,然后在click函数里写了这两行代码。

            Canvas.SetLeft(MyEllipCanvas.GetLeft(MyRect));
            Canvas.SetTop(MyEllipCanvas.GetTop(MyRect));

运行,点击button,如果大家上面做的和我一样的话,会发现,Ellipse木有了!我伙呆!

其实事实是Ellipse被Rectangle挡住了,因为在xaml中,rectangle是写在Ellipse下面的,所以他会在Z轴上高于Ellipse。怎么解决呢?你可以把Ellipse放到Rectangle下面,也可以在代码中直接写:

Canvas.SetLeft(MyEllipCanvas.GetLeft(MyRect));
            Canvas.SetTop(MyEllipCanvas.GetTop(MyRect));
            Canvas.SetZIndex(MyEllip1);

 

也就是加上了最后一样,然后再点一下button试试。

 

Ok,就讲到这里吧。我也一直在学习,谢谢大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值