使用XAML创建自定义图形

来源:互联网 发布:美联航空大数据信息 编辑:程序博客网 时间:2024/05/29 03:07

原文地址:http://www.dingos.cn/index.php?topic=2013.0
<!-- /* Font Definitions */ @font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 680460288 22 0 262145 0;}@font-face{font-family:"Cordia New";panose-1:2 11 3 4 2 2 2 2 2 4;mso-font-charset:0;mso-generic-font-family:swiss;mso-font-pitch:variable;mso-font-signature:-2130706429 0 0 0 65537 0;}@font-face{font-family:"Cambria Math";panose-1:2 4 5 3 5 4 6 3 2 4;mso-font-charset:1;mso-generic-font-family:roman;mso-font-format:other;mso-font-pitch:variable;mso-font-signature:0 0 0 0 0 0;}@font-face{font-family:华文中宋;panose-1:2 1 6 0 4 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:647 135200768 16 0 262303 0;}@font-face{font-family:"/@华文中宋";panose-1:2 1 6 0 4 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:647 135200768 16 0 262303 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 680460288 22 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-unhide:no;mso-style-qformat:yes;mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;mso-para-margin-top:.5gd;mso-para-margin-right:0cm;mso-para-margin-bottom:0cm;mso-para-margin-left:0cm;mso-para-margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:15.0pt;font-family:"Cordia New","sans-serif";mso-fareast-font-family:华文中宋;mso-bidi-font-family:宋体;color:black;mso-font-kerning:18.0pt;}a:link, span.MsoHyperlink{mso-style-priority:99;color:blue;text-decoration:underline;text-underline:single;}a:visited, span.MsoHyperlinkFollowed{mso-style-noshow:yes;mso-style-priority:99;color:purple;mso-themecolor:followedhyperlink;text-decoration:underline;text-underline:single;}.MsoChpDefault{mso-style-type:export-only;mso-default-props:yes;mso-bidi-font-size:15.0pt;mso-ascii-font-family:"Cordia New";mso-fareast-font-family:华文中宋;mso-hansi-font-family:"Cordia New";mso-bidi-font-family:宋体;color:black;mso-font-kerning:18.0pt;}.MsoPapDefault{mso-style-type:export-only;margin-top:0cm;mso-para-margin-top:.5gd;text-align:justify;text-justify:inter-ideograph;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:612.0pt 792.0pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:36.0pt;mso-footer-margin:36.0pt;mso-paper-source:0;}div.Section1{page:Section1;}-->

不知道你在WPF之前是否绘制自己的形状,如果没有,这原本是件很困难的事情。在WPF中绘制形状,不想需要重写OnPaint方法或添加Paint监听器。你可以简单的创建一个图形就像放置任何对象到你想要的位置。

为了使用XAMLWPF,你可能需要Visual Studio 2008ExpressionBlend 2。你可以从 http://www.microsoft.com/express/ 下载Visual StudioExpressEdition免费版本,或你可以从http://www.microsoft.com/expression/products/Overview.aspx?key=blend获得Expression Blend的使用版本(悲哀呀,Expression产品没有免费版本)。

让我们从简单示例开始。我喜欢的一个游戏是俄罗斯方块,这里是一个俄罗斯方块的形状。


这里是上面应用程序所需要的程序代码。

<Window x:Class="XAMLCustomShapes.Window1"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   Title="XAML Custom Shapes" Height="350" Width="350">

    <Canvas>

        <PathCanvas.Left="15" Canvas.Top="50" Stroke="Black"

       Data="M 0,0 L 200,0 L 200,100 L 300,100 L 300,200 L 100,

              200 L100,100 L 0,100 Z">

            <Path.Fill>

                <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">

                   <GradientStop Offset="0" Color="DarkBlue" />

                   <GradientStop Offset="1" Color="LightBlue" />

                </LinearGradientBrush>

            </Path.Fill>

        </Path>

    </Canvas>

</Window>

这这里面包含许多东西,但我们唯一关心的是Path对象和它的Data属性。当创建自定义图像时Path是非常有用的,这也是使用它们来画图。

通过Data属性定义形状。这个语法有点怪,但如果你习惯了这种写法,你会发现比以前的方式更有效。如果你使用过其他语言绘制图形,你可能熟悉命名像lineTomoveToarcTo等的函数。WPF用一个包含特殊符号的长的字符串来替代这些方法。在这个示例中,“L”表示lineTo,“M”表示moveTo。下面的图像显示每个字符串表示什么图形块。

正如你所见,我的图形是从“M 0, 0”开始。我笔的位置在形状的左上角。可以在任何你想的地方开始我们的图形,但(0, 0)是俄罗斯方块的开始。下一块,“L 200, 0”从我们的开始位置(0, 0)话了一条直线,这个特殊的点(200, 0)以“L”开头。当你画一条线到另一点,任何后续的点都是从上一个位置开始。为了简单,我继续使用“L”命令画线知道我的图形完成。在上面的Data字符串最后一个字符“Z 说明这个图形的路径完成。

WPF中有像“M”,“L”和“Z”一样的更多命令。在这里不一一讨论他们,可以冲MSDN中的一篇好文章PathMarkup Syntaxhttp://msdn.microsoft.com/en-us/library/ms752293.aspx)获得有关它们的详细介绍。

好吧,我认为我们已经可以绘制直线了。现在让我们来看看稍微负责点的图形 曲线。WPF有许多不同类型的曲线 二次贝塞尔曲线,平滑三次贝塞尔曲线,平滑二次贝塞尔曲线和椭圆弧。是的,我不知道他们是什么,但在MSDN文中中我注意到在最后的段落中有关于他们的解释。如果你真的真的想知道更多,可以点击维基百科中关于贝塞尔曲线的文章(http://en.wikipedia.org/wiki/B%C3%A9zier_curve)。

这里是在顶部和底部具有圆弧的俄罗斯方块。代码如下所示:

<Window x:Class="XAMLCustomShapes.Window1"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   Title="XAML Custom Shapes" Height="350" Width="350">

    <Canvas>

        <PathCanvas.Left="15" Canvas.Top="50" Stroke="Black"

       Data="M 0,0 A 15,5 180 1 1 200,0 L 200,100 L 300,100

             L300,200 A 15,5 180 1 1 100,200 L 100,100 L 0,100 Z">

            <Path.Fill>

                <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">

                    <GradientStop Offset="0" Color="DarkBlue" />

                   <GradientStop Offset="1" Color="LightBlue" />

                </LinearGradientBrush>

            </Path.Fill>

        </Path>

    </Canvas>

</Window>

对于这条曲线,我用的是椭圆弧。基本上,所有的椭圆弧在当前点和特定的结束点画一个圆弧。弧的选项(按字符串顺序)有:ArcSizehttp://msdn2.microsoft.com/en-us/library/system.windows.media.arcsegment.rotationangle.aspx)、RotationAnglehttp://msdn2.microsoft.com/en-us/library/system.windows.media.arcsegment.rotationangle.aspx)、IsLargeArchttp://msdn2.microsoft.com/en-us/library/system.windows.media.arcsegment.islargearc.aspx)、SweepDirectionhttp://msdn2.microsoft.com/en-us/library/system.windows.media.arcsegment.sweepdirection.aspx)和结束点。在MSDN关于画椭圆的文中有关于每个属性的解释,因此这里不重复。正如你看到的,画一条曲线和或一条直线没有太多的不同 仅仅多了几个选项。

我认为仅仅是没有自定义图形。使用直线和椭圆线,可以画任何想要的图形。当然,这有血多不同的路径选择,你应该探索如何让你的图形像你所希望的。

原创粉丝点击