• Canvas中元素的定位


    CanvasDockPanelGridStackPanelWrapPanelWPF中的5个布局控件.每个布局控件都有不同的应用场景.如果您要对元素进行精确的定位,那么就需要使用Canvas.

       可以把Canvas比作一个坐标系,所有的元素通过设置坐标来决定其在坐标系中的位置.这个坐标系的原点并不是在中央,而是位于它的左上角.见下图

     

    元素设置坐标的方法共有四个:

    l         Canvas.Top     设置元素距Canvas顶部的距离

    l         Canvas.Bottom  设置元素距Canvas底部的距离

    l         Canvas.Left     设置元素距Canvas左边界的距离

    l         Canvas.Right    设置元素距Canvas右边界的距离

     

     

     

    看完了概念的介绍,作些例子加深印象吧J.

     

    来个简单的先

     

      <Canvas>

        <Button>button</Button>

      </Canvas>

     

    在上面的xaml中定义了一个Canvas对象,Canvas中包含了一个按钮.

    因为没有对按钮进行任何定位的操作,所以按钮位于Canvas容器的左上角(即位于原点).见下图

     

    现在改变一下按钮的位置

       <Canvas>

        <Button Canvas.Left="20" Canvas.Top="20" Width="50" Height="20">button</Button>

      </Canvas>


     
      对比上图
    ,按钮的位置为向右下偏移了一些. 看来Canvas.TopCanvas.Left起作用了,我们可以得知按钮左上角坐标为(20,20)

        当然还可以从上面的代码中得到更多的信息:

    l         按钮左下角的坐标 (20,40)

    l         按钮右上角的坐标 (70,20)

    l         按钮右下角的坐标 (70,40)

      

    我是如何得到这些信息的呢?下面慢慢解释:

    按钮左下角坐标的x值和左上角的一样,也为20。其y轴坐标在原有的基础上又增加了一些:加上了按钮的高度.所以得出了(20,40) .后面两个坐标可依此推出。


         您可能还会有些疑问
    : Canvas.Left可以设置元素左边距离Canvas左边界的距离,Canvas.Rigth可以设置元素右边距离Canvas右边界的距离,那如果同时设置Canvas.Left属性和Canvas.Right属性,会出现什么情况呢.?

    看个例子您就知道了:

    <Canvas>

        <Button Canvas.Right="20"  Canvas.Left="20">Right="20"  Left="20"</Button>

    </Canvas>

     

     上图中我们看到,在同时设置了Canvas.LeftCanvas.Right属性的情况下,只有Canvas.Left属性起作用,而Canvas.Right失效,实际上Canvas.TopCanvas.Bottom同时存在时也只是Canvas.Top一个起作用)


        
    看到这里,估计您对元素在Canvas中的定位已经有了大致的了解.下面再深入的介绍一下.

    上面的介绍的按钮代表没有设置坐标的元素在Canvas中的定位.也就是说这些元素的左上角坐标为(0,0)点。那么那些拥有坐标系属性(请允许我这么叫)的元素情况又是如何呢(拥有坐标系属性的元素:Line,Polyline,Polyline等等,或者使用Geometry对象填充的一些元素)

    Line元素为例:

        <Canvas>

        <Button  Canvas.Left="20" Height="20" Width="60">Left="20"</Button>

        <Line X1="20"  X2="20" Y1="20" Y2="100" Stroke="Black"/>

        <Button  Canvas.Left="20" Canvas.Top="100" Height="20"  Width="60">Left="20"</Button>

      </Canvas>

     

    上面的代码在Canvas绘制了一条起始点为(20,20)终点为(20,100)的黑色线段.为了方便进行观察,我又在Canvas中添加了两个按钮作为参照.第一个按钮的高度为20,宽度为60,Canvas.Left20..第二个按钮的高度,宽度,Canvas.Left和第一个按钮相同,单设置了Canvas.Top100. 根据计算得出:线段的起始点坐标和第一个按钮坐下角的坐标一致,终点坐标和第二个按钮的左上角坐标一直。实际效果也是如此:见下图

     

    再看一个Line的例子,在上面的基础上再添加一条线段:

        <Line X1="20"  X2="20" Y1="20" Y2="100" Stroke="Red" Canvas.Left="60"/>

    该线段的坐标和第一条完全一样,不同之处是设置了Canvas.Left,并将颜色改成了红色

     

    <Canvas>

          <Button  Canvas.Left="20" Height="20" Width="60">Left="20"</Button>

          <Line X1="20"  X2="20" Y1="20" Y2="100" Stroke="Black"/>

          <Line X1="20"  X2="20" Y1="20" Y2="100" Stroke="Red" Canvas.Left="60"/>

          <Button  Canvas.Left="20" Canvas.Top="100" Height="20"  Width="60">Left="20"</Button>

    </Canvas>

    那么效果会如何呢?


       红色的线段出现在黑色线段的右边,并且与黑色线段的
    x轴的值相差了60.您会发现它的效果和以下代码相同:

    <Line X1="80"  X2="80" Y1="20" Y2="100" Stroke="Red" />

     

    可以看出,设置了Canvas.Left=60后,红色线段的两个x坐标相当于均添加了60

     

      对设置了坐标系的元素而言,Canvas.Left会均等的增加其全部坐标中x轴的值;

    Canvas.Top会均等增加其全部坐标中y轴的值。

      

     文本没有过多的涉及Canvas.RightCanvas.Bottom。主要是因为当Canvas没有设置WidthHeight属性时,没有一个所谓的“终点”作为参照坐标(对应原点来说),这样定位元素就不是很方便了。当然您也可以通过计算Canvas.ActualWeightCanvas.ActualHeight来计算。有兴趣的朋友可以尝试一下:)

        希望本文您能从本文中获益,感谢您的阅读
  • 相关阅读:
    linux 统计文件信息 wc
    实现TRACE宏功能(内联函数形式和宏形式),无MFC时打印到Output窗口
    MFC关联控件和WORD类型变量 DDX_TEXT for WORD Walkaround
    winsock2.h头文件重复定义链接错误问题解决
    The Visual Studio Remote Debugger service on the target computer cannot connect back to this computer
    组策略 允许空密码
    使用template扩展已有的DDX_Text函数,使扩展能够同时支持各种数据类型的一个例子
    好文转载—为程序员量身定制的12个目标
    好文转载—六步创建一个安全的密码
    Win8下VS调试提升权限,避免权限造成的程序运行错误
  • 原文地址:https://www.cnblogs.com/stswordman/p/531031.html
Copyright © 2020-2023  润新知