WPF常用path示例
- 格式:doc
- 大小:216.00 KB
- 文档页数:13
WPF中元素拖拽的两个实例 今天结合之前做过的⼀些拖拽的例⼦来对这个⽅⾯进⾏⼀些总结,这⾥主要⽤两个例⼦来说明在WPF中如何使⽤拖拽进⾏操作,元素拖拽是⼀个常见的操作,第⼀个拖拽的例⼦是将ListBox中的⼦元素拖拽到ListView的某⼀个节点,从⽽将该⼦元素作为当前节点的⼦节点。
第⼆个例⼦就是将ListView的某⼀项拖拽到另外⼀项上从⽽使两个⼦项位置互换,这两个例⼦的原理类似,实现细节上有所差别,下⾯就具体分析⼀下这些细节。
DEMO1 ⼀⽰例截图图⼀⽰例⼀截图 ⼆重点原理分析2.1 前台代码分析 这⼀部分主要是主界⾯的分析,主要包括两个部分⼀个是左侧的ListBox另外⼀个就是右侧的TreeView,在Treeview上设置了两个事件,⼀个是DragDrop.DragOver事件,另外⼀个是DragDrop.Drop事件,同时设置TreeView的AllowDrop属性为true,关于这两个事件后⾯再做重点分析。
⾸先看看前台代码:<Window x:Class="DragDrop.MainWindow"xmlns="/winfx/2006/xaml/presentation"xmlns:x="/winfx/2006/xaml"xmlns:d="/expression/blend/2008"xmlns:mc="/markup-compatibility/2006"xmlns:local="clr-namespace:DragDrop"mc:Ignorable="d"Title="MainWindow" Height="350" Width="525"><Window.Resources><DataTemplate x:Key="listBoxTemplate" DataType="{x:Type local:DataItem}"><TextBlock Text="{Binding Header}"/></DataTemplate><HierarchicalDataTemplate x:Key="treeViewTemplate" DataType="{x:Type local:DataItem}" ItemsSource="{Binding Items}"><TextBlock Text="{Binding Header}"/></HierarchicalDataTemplate></Window.Resources><Grid x:Name="mTopLevelGrid"><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="10"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><ListBox x:Name="mListBox" Grid.Column="0" ItemsSource="{Binding Source={x:Static local:Data.Instance}, Path=ListBoxItems}" ItemTemplate="{StaticResource listBoxTemplate}"/><TreeView x:Name="mTreeView" Grid.Column="2" ItemsSource="{Binding Source={x:Static local:Data.Instance}, Path=TreeViewItems}" ItemTemplate="{StaticResource treeViewTemplate}" AllowDrop="True" DragDrop.DragOver="OnDragOver" DragDrop.Drop="OnDrop"/></Grid></Window> 2.2 后台代码分析 下⾯重点分析后台代码,在构造函数中我们⾸先为ListBox订阅了两个事件,⼀个是:PreviewMouseMove,另外⼀个是QueryContinueDrag,关于第⼀个事件就不做过多的说明,第⼆个事件是QueryContinueDrag:QueryContinueDrag在MSDN上的解释是在拖放操作期间键盘或⿏标按钮的状态改变时发⽣。
WPF常⽤控件⽤法及介绍1.GroupBox注意: GroupBox仍然需要布局容器来放置元素。
如: StackPanel⾯板<GroupBox Header="select number?"><StackPanel><RadioButton>one</RadioButton><RadioButton>two</RadioButton><RadioButton>three</RadioButton></StackPanel></GroupBox>2.TabControl像这种标签页控件, 在winform种⾮常常见, Tabpge⼦页⾯, ⽽在WPF种, 对应的则是TabItem类。
所⽰的代码⽰意图:<TabControl><TabItem Header="⾸页"><StackPanel><Button>button1</Button><Button>button2</Button><Button>button3</Button></StackPanel></TabItem><TabItem Header="第⼆页"><StackPanel><Button>button4</Button><Button>button5</Button><Button>button6</Button></StackPanel></TabItem></TabControl>与Content属性相同, TabItem的Header同样可以接收任何类型的对象。
一、通过代码实现数据绑定通过代码实现数据绑定,使用的是System.Windows.Data命名空间的Binding类,主要使用Binding类的如下的属性:∙Source属性:绑定到的数据源∙Mode属性:绑定的模式(OneTime、OneWay、TwoWay、OneWayToSource或Default)∙Path属性:绑定到的数据源的属性∙Converter属性:绑定时所使用的类型转换器在绑定目标控件上使用SetBinding方法添加数据绑定。
例如将MyData的Name属性绑定到txtName控件的Text属性上,使用MyColorConverter转换器将MyBindingColor的ColorObject属性绑定到rec控件的Fill属性上:1: MyData data = new MyData();2:3: Binding binding1 = new Binding();4: binding1.Source = data;5: binding1.Mode = BindingMode.OneWay;6: binding1.Path = new PropertyPath("Name");7:8: txtName.SetBinding(TextBox.TextProperty, binding1);9:10:11: MyBindingColor color = new MyBindingColor();12:13: Binding binding2 = new Binding();14: binding2.Source = color;15: binding2.Mode = BindingMode.OneWay;16: binding2.Path = new PropertyPath("ColorObject");17: binding2.Converter = new MyColorConverter();18:19: rec.SetBinding(Rectangle.FillProperty, binding2);二、实现绑定数据的验证:对于绑定数据的验证,系统采用如下的机制:使用WPF 数据绑定模型可以将ValidationRules 与Binding 对象相关联。
WPF中⾃定义MarkupExtension 在介绍这⼀篇⽂章之前,我们⾸先来回顾⼀下WPF中的⼀些基础的概念,⾸先当然是XAML了,XAML全称是Extensible Application Markup Language (可扩展应⽤程序标记语⾔),是专门⽤于WPF技术中的UI设计语⾔,通过使⽤XAML语⾔,我们能够快速设计软件界⾯,同时能够通过绑定这种机制能够很好地实现界⾯和实现逻辑之间的解耦,这个就是MVVM模式的核⼼了,那么今天我们介绍的MarkupExtension和XAML之间⼜有哪些的关系呢? Markup Extension,顾名思义,就是对xaml的扩展,在XAML中,规定如果属性以{}开始及结束,就是Markup Extension,Markup Extension指的是继承于的类,⾸先我们通过⼀张图来看看WPF中有哪些已知的Markup Extension。
看了这张图⽚之后是不是对这个MarkupExtension有⼀个常规的认识,你会发现这个在WPF中实在是太重要了,通过这个MarkupExtension我们能够实现绑定、资源等等⼀系列的操作,在介绍完这个之后,我们来看看,这个抽象的MarkupExtension基类到底是什么?⾥⾯包含些什么?怎么去使⽤它?#region 程序集 WindowsBase.dll, v3.0.0.0// C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\WindowsBase.dll#endregionusing System;namespace System.Windows.Markup{// 摘要:// 为所有 XAML 标记扩展提供基类。
public abstract class MarkupExtension{// 摘要:// 初始化从 System.Windows.Markup.MarkupExtension 派⽣的类的新实例。
WPF获取应用程序路径方法,获取程序运行路径方法不能直接"D://WPF....",这样获取的话,到时发布还是会出错,具体的解决方法如下:AppDomain.CurrentDomain.BaseDirectory +文件名即可,简单吧//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str5=Application.StartupPath;//可获得当前执行的exe的文件名。
string str1 =Process.GetCurrentProcess().MainModule.FileN ame;//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
备注按照定义,如果该进程在本地或网络驱动器的根目录中启动,则此属性的值为驱动器名称后跟一个尾部反斜杠(如“C:\”)。
如果该进程在子目录中启动,则此属性的值为不带尾部反斜杠的驱动器和子目录路径(如“C:\mySubDirectory”)。
string str2=Environment.CurrentDirectory;//获取应用程序的当前工作目录。
string str3=Directory.GetCurrentDirectory();//获取基目录,它由程序集冲突解决程序用来探测程序集。
string str4=AppDomain.CurrentDomain.BaseDirectory;//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str5=Application.StartupPath;//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str6=Application.ExecutablePath;//获取或设置包含该应用程序的目录的名称。
string str7=AppDomain.CurrentDomain.SetupInformation.A pplicationBase。
wpf经典编程实例摘要:一、WPF 概述1.WPF 的发展历程2.WPF 的特点和优势3.WPF 的应用领域二、WPF 编程实例1.创建一个简单的WPF 应用程序2.WPF 控件的使用3.数据绑定与数据模板4.交互式用户界面设计5.应用程序的生命周期管理三、WPF 的高级应用1.资源管理2.样式与主题3.动画与过渡效果4.触摸与手写输入5.多线程与并行计算四、WPF 的发展趋势与展望1.UWP 与WPF 的异同2.WPF 的未来发展3.WPF 在我国的应用现状与前景正文:WPF(Windows Presentation Foundation)是微软推出的一种基于.NET Framework 的图形用户界面(GUI)技术。
自2006 年首次亮相以来,WPF 迅速成为Windows 应用程序开发的主流技术,广泛应用于桌面、网页和移动设备等多个领域。
本文将介绍WPF 的基本概念、编程实例以及高级应用,并展望其发展趋势。
一、WPF 概述WPF 是微软在.NET Framework 3.0 中引入的一种全新的GUI 技术,其设计理念是简化开发人员的工作,提高开发效率,并为用户带来更丰富的体验。
WPF 通过使用XAML(可扩展应用程序标记语言)和C#(或)来描述和实现用户界面,具有强大的数据绑定、丰富的控件库和良好的性能等特点。
1.WPF 的发展历程WPF 的前身为“Avalon”,是微软在2000 年左右开始研发的一种新一代GUI 技术。
随着.NET Framework 的发展,WPF 逐渐成为Windows 应用程序开发的核心技术。
2.WPF 的特点和优势WPF 具有许多特点和优势,例如:- 基于XML 的语言(XAML)使界面设计更加直观和易于维护;- 丰富的控件库提供了各种常用控件,如按钮、文本框、列表框等;- 数据绑定功能使开发者能够轻松地将数据与界面元素关联起来;- 良好的性能,支持硬件加速,提高了应用程序的运行速度。
wpf converter参数WPF Converter参数在WPF (Windows Presentation Foundation) 中,Converter是一种常用的工具,用于在数据绑定过程中进行数据转换。
通过使用Converter,可以将绑定的数据从一种形式转换为另一种形式,以满足UI界面的需求。
本文将介绍WPF Converter的参数以及如何使用它们进行数据转换。
在WPF中,Converter参数可以分为两类:输入参数和输出参数。
输入参数是在XAML中绑定时指定的,用于传递给Converter的数据。
输出参数是Converter转换后的结果,将作为绑定目标的值。
一、输入参数1. Value:Value参数是最常用的输入参数之一,它表示绑定的源数据。
在XAML中,可以通过设置Binding的Path属性来指定绑定的数据源。
2. TargetType:TargetType参数用于指定绑定目标的数据类型。
在某些情况下,WPF无法自动推断绑定目标的数据类型,这时就需要显式指定TargetType参数。
3. Parameter:Parameter参数用于传递额外的参数给Converter。
这个参数可以是任何类型,可以用于在转换过程中进行一些特定的操作或判断条件。
二、输出参数1. Convert:Convert方法是Converter的核心方法,用于将输入参数转换为输出参数。
在Convert方法中,可以编写自定义的转换逻辑,根据输入参数的值来计算输出参数的值。
2. ConvertBack:ConvertBack方法是Convert方法的逆过程,用于将输出参数转换回输入参数。
在某些情况下,需要双向绑定,即用户对界面进行修改后,需要将修改后的值反向传递给数据源。
这时就需要实现ConvertBack方法。
三、使用参数进行数据转换在实际使用中,可以根据需求对Converter的参数进行组合和调整,以实现不同的数据转换效果。
WPF中的命令简述[收藏此页] [打印]作者:(来自大可山博客) 2007-09-04内容导航:WPF命令简述第1页: WPF命令简述第2页:关于Command的四个概念第3页:四个小问题第4页:如何设置Command Target并进行绑定Comm...【IT168技术文档】在我们日常的应用程序操作中,经常要处理各种各样的命令和进行相关的事件处理,比如需要复制、粘贴文本框中的内容;上网查看网页时,可能需要返回上一网页查看相应内容;而当我们播放视频和多媒体时,我们可能要调节音量,快速拖动到我们想看的片段等等。
在Winform编程中,我们经常使用各种各样的控件来解决此类问题,当然我们也必须编写一堆代码来处理各种各样的命令和事件处理。
那么,Windows Presentation Foundation (WPF)作为微软新一代图形图像支援系统,它是如何处理这些命令及事件的呢?在WPF中,许多控件都自动集成了固有的命令集。
比如文本框TextBox就提供了复制(Copy),粘贴(Paste),裁切(Cut),撤消(Undo)和重做(Redo)命令等。
WPF提供常用应用程序所用的命令集,常用的命令集包括:ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands和EditingCommands。
ApplicationCommands(应用程序命令):CancelPrint:取消打印Close:关闭ContextMenu:上下文菜单Copy:复制CorrectionList: Gets the value that represents the Correction List command.Cut:剪切Delete:删除Find:查找Help:帮助New:新建NotACommand:不是命令,被忽略Open:打开Paste:粘贴Print:打印PrintPreview:打印预览Properties:属性Redo:重做Replace:取代Save:保存SaveAs:另存为SelectAll:选择所有的Stop:停止Undo:撤消ComponentCommands(组件命令):ExtendSelection:后接Down/Left/Right/Up, 比如:ExtendSelectionDown (Shift+Down,Extend Selection Down),ExtendSelectionLeft等Move:后接Down/Left/Right/Up, 如:MoveDownMoveFocus:后接Down/Forward/Back/Up, 如:MoveFocusDown MoveFocusPage:后接Down/Up,如:MoveFocusPageUpMoveTo:后接End/Home/PageDown/PageUp,比如:MoveToPageDown ScrollByLineScrollPage:后接Down/Left/Right/Up,比如:ScrollPageLeft SelectTo:End/Home/PageDown/PageUp,比如:SelectToEndNavigationCommands(导航命令):Browse浏览: 后接Back/Forward/Home/Stop, 比如:BrowseBack缩放显示:DecreaseZoom, IncreaseZoom, ZoomFavorites(收藏)页面:FirstPage, LastPage, PreviousPage, NextPage,GoToPage NavigateJournalRefresh(刷新)Search(搜索)MediaCommands(多媒体控制命令):Treble高音:DecreaseTreble,IncreaseTrebleBass低音:BoostBass,DecreaseBass,IncreaseBassChannel频道:ChannelDown,ChannelUpMicrophoneVolume麦克风音量调节:DecreaseMicrophoneVolume,IncreaseMicrophoneVolume,MuteMicrophoneVo lumeToggleMicrophoneOnOff:麦克风开关Volume音量: DecreaseVolume,IncreaseVolume,MuteVolumeRewind, FastForward(回放,快进)Track轨道:PreviousTrack,NextTrack [上一段(节)]Play,Pause,Stop,Record(播放,暂停,停止,录制)TogglePlayPauseSelect选择EditingCommands(编辑/排版类命令):Align对齐:AlignCenter,AlignJustify,AlignLeft,AlignRight(居中,撑满,左对齐,右对齐)Backspace退格TabForward,TabBackward(Tab前缩,Tab向后)FontSize字体大小:DecreaseFontSize,IncreaseFontSizeIndentation缩排:DecreaseIndentation, IncreaseIndentationDelete删除: Delete选中部分,DeleteNextWord:删除后一字,DeletePreviousWord:删除前一字EnterLineBreak:换行EnterParagraphBreak:换段CorrectSpellingError/IgnoreSpellingError:纠正/忽略拼写错误MoveUpByLine,MoveDownByLine: 上/下移一行,MoveUpByPage,MoveDownByPage: 上/下移一页MoveUpByParagraph,MoveDownByParagraph: 上/下移一段MoveLeftByCharacter/MoveRightByCharacter:左/右移一字符MoveLeftByWord/MoveRightByWord 左/右移一词MoveToDocumentStart/MoveToDocumentEnd:到文章开头/结尾MoveToLineStart/MoveToLineEnd:到一行的开头/结尾SelectUpByLine,SelectDownByLine:向上/下选一行SelectUpByPage,SelectDownByPage:向上/下选一页SelectUpByParagraph,SelectDownByParagraph:向上/下选一段SelectLeftByCharacter,SelectRightByCharacter:向左/右选中一字SelectLeftByWord,SelectRightByWord:向左/右选中一词SelectToDocumentStart,SelectToDocumentEnd: 选中到篇头/篇尾SelectToLineStart/SelectToLineEnd:选中到行首/行尾ToggleBold, ToggleItalic, ToggleUnderline(加粗,斜体,下划线) ToggleBullets, ToggleNumbering(列表:加点,加数字)ToggleInsert:插入ToggleSuperscript,ToggleSubscript(上标字,下标字)先来举一个简单的例子:XAML代码:粘贴命令。
Basic Path大写的M 指示startPoint 是绝对值;小写的m 指示startPoint 是相对于上一个点的偏移量,如果是(0,0),则表示不存在偏移。
当您在移动命令之后列出多个点时,即使您指定的是线条命令,也将绘制出连接这些点的线。
如M 10,50 200,400创建方法:<Path Stroke="Green" StrokeThickness="3" Data="M 10,50 200,400" /><Path Stroke="Gold" StrokeThickness="3" ><Path.Data><PathGeometry><PathFigure StartPoint="200,200"><PathFigure.Segments ><LineSegment Point="400,100"/></PathFigure.Segments></PathFigure></PathGeometry></Path.Data></Path>#region create method 1Path path = new Path();PathGeometry pathGeometry = new PathGeometry();PathFigure pathFigure = new PathFigure();pathFigure.StartPoint = new Point(400, 300);PathSegmentCollection segmentCollection = new PathSegmentCollection();segmentCollection.Add(new LineSegment() { Point = new Point(600, 100) });pathFigure.Segments = segmentCollection;pathGeometry.Figures = new PathFigureCollection() { pathFigure };path.Data = pathGeometry;path.Stroke = new SolidColorBrush(Colors.BlueViolet);path.StrokeThickness = 3;main.Children.Add(path);#endregion#region create method2Path pp = new Path();pp.Stroke = new SolidColorBrush(Colors.Blue);pp.StrokeThickness = 3;StreamGeometry geometry = new StreamGeometry();geometry.FillRule = FillRule.Nonzero; //声前F0还是F1,现在是F1using (StreamGeometryContext ctx = geometry.Open()){ctx.BeginFigure(new Point(30, 60), true, true);ctx.LineTo(new Point(150, 600), true, false);}geometry.Freeze();pp.Data = geometry;main.Children.Add(pp);#endregion#region create method3Path pp3 = new Path();//pp3.Datapp3.Stroke = new SolidColorBrush(Colors.Red);pp3.StrokeThickness = 3;GeometryConverter gc = new GeometryConverter();pp3.Data = (Geometry)gc.ConvertFromString("M 20,30 500,100");main.Children.Add(pp3);#endregionBezier 三次方贝塞尔曲线三次方贝塞尔曲线命令通过使用两个指定的控制点(controlPoint1 和controlPoint2)在当前点与指定的终点之间创建一条三次方贝塞尔曲线。
M 40,300 C 560,40 300,430 750,400P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝塞尔曲线。
曲线起始于P0走向P1,并从P2的方向来到P3。
一般不会经过P1或P2;这两个点只是在那里提供方向资讯。
P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的长度有多长。
<Path Stroke="BlueViolet" StrokeThickness="3"><Path.Data><PathGeometry><PathFigure StartPoint="10,10"><BezierSegment Point1="260,40" Point2="400,430"Point3="700,300" IsSmoothJoin="True"/></PathFigure></PathGeometry></Path.Data></Path><Path Stroke="Red" StrokeThickness="3" Data="M 40,300 C 560,40 300,430 750,400" />以下的折线为正常的线,曲线为贝塞尔曲线Bezier 平滑的三次方贝塞尔曲线在当前点与指定的终点之间创建一条三次方贝塞尔曲线。
第一个控制点假定为前一个命令的第二个控制点相对于当前点的反射。
如果前一个命令不存在,或者前一个命令不是三次方贝塞尔曲线命令或平滑的三次方贝塞尔曲线命令,则假定第一个控制点就是当前点。
第二个控制点,即曲线终端的控制点,由controlPoint2 指定。
例如,<Path Stroke="Red" StrokeThickness="3" Data="M 40,300 S 560,40 300,430 " />以下的折线为正常的线,曲线为贝塞尔曲线水平线或者垂直线<Path Data="m 0,200 h 800" Stroke="Violet" StrokeThickness="3"/><Path Data="m 400,10 v 400" Stroke="Violet" StrokeThickness="3"/> 二次方贝塞尔曲线二次贝塞尔曲线命令通过使用指定的控制点(controlPoint) 在当前点与指定的终点之间创建一条二次贝塞尔曲线。
q 100,200 300,200 是有效的二次贝塞尔曲线命令示例。
<Path Stroke="BlueViolet" StrokeThickness="3"><Path.Data><PathGeometry><PathFigure StartPoint="10,10"><QuadraticBezierSegment Point1="260,40"Point2="400,430" IsSmoothJoin="True"/></PathFigure></PathGeometry></Path.Data></Path><Path Stroke="Red" StrokeThickness="3" Data="M 40,300 Q 260,140 300,430 " />平滑的二次方贝塞尔曲线平滑二次贝塞尔曲线命令在当前点与指定的终点之间创建一条二次贝塞尔曲线。
控制点假定为前一个命令的控制点相对于当前点的反射。
如果前一个命令不存在,或者前一个命令不是二次贝塞尔曲线命令或平滑的二次贝塞尔曲线命令,则此控制点就是当前点。
<Path Stroke="Red" StrokeThickness="3" Data="M 40,300 T 260,140 300,430 " />椭圆弧线椭圆弧线命令在当前点与指定的终点之间创建一条椭圆弧线。
<Path Stroke="Black"StrokeThickness="3" HorizontalAlignment="Center" ><Path.Data><PathGeometry><PathFigure><PathFigure.Segments><ArcSegment Point="400,300" RotationAngle="180"Size="10,10" ></ArcSegment></PathFigure.Segments></PathFigure></PathGeometry></Path.Data></Path>一条或多条三次方贝塞尔曲线PolyBezierSegment使用PathFigure 对象存储PolyBezierSegment 对象和其他线段。
一条三次方贝塞尔曲线由四个点来定义:一个起点、一个终点和两个控制点。