文章标签 ‘WPF’
上一篇,我们实现了同一窗体间的拖放,并且显示鼠标跟随效果,今天,我们来实现不同窗体之间的拖放,因为不是用一个窗体,而Adorner(装饰器)只能在父窗体内移动,所以,我们实现不同窗体之间显示鼠标跟随效果,就要再新建一个窗体来显示鼠标跟随的内容。我们先看一下完成后的效果图。 由于要获得鼠标相对屏幕坐标和把拖放窗体的位置带到放置窗体的位置,需要使用Win32 API来完成,我们先创建一个类,代码如下: 我们通过GetCursorPos()方法获得鼠标坐标,GetWindowLong()、SetWindowLong()方法获得和设置窗体属性。 接下来,我们编写拖拽窗体Window1.xaml.cs,代码如下 关键代码在StartDragWindow(MouseEventArgs)这个方法,开始拖拽时,我们先创建_dragdropWindow这个拖拽窗体,并进行相应初始化操作,定义被拖拽物体(这里为矩形)状态发生变化时调用UpdateWindowLocation()方法,更新拖拽窗体位置,拖拽完成后调用DestroyDragDropWindow()方法,销毁拖拽窗体,这一系列过程,达到完成窗体拖拽操作。 最后,我们编写放置窗体Window2.xaml.cs,代码如下 这里的代码很简单,WPF的拖放(一)已经有说明,有什么不明白就看文章一吧。 本文代码下载
上一篇,我们实现了基本拖拽操作,今天,我们来实现,拖拽过程中鼠标跟随效果,这里我们要用到WPF新对象Adorner(装饰器)用来显示拖拽内容,如我们今天拖拽的矩形。首先,我们新建一个DragAdorner类,继承Adorner用来显示拖拽内容,代码如下 我们声明几个对象,并且修改上篇代码中矩形的PreviewMouseMove事件 这样,就实现了,拖拽过程中显示跟随效果。关键代码就在StartDrag(MouseEventArgs)方法中,开始拖放的时候创建显示拖拽的对象,移动过程中更改装饰坐标,鼠标释放的时候移除装饰对象。看懂了之后,会发现WPF的拖拽并不复杂,但是,如何实现不同窗体之间的拖拽呢?后面我们会做介绍。 本文代码下载
拖放在C/S开发过程中总是一个难点,但是,为了得到更好的用户体验,很多地方还是需要使用到拖放的,今天,我们介绍一下WPF的拖放。 还是以往的惯例,用实例来说明WPF的拖放是如何实现的。 我们要实现的就是让左边的红色矩形移动到右边。首先,我们先编写xaml文件,代码如下 接着,我们来实现拖放中的拖,这个是最重要的部分,首先,我们注册矩形的PreviewMouseMove事件。代码如下: 需要说明的是这里的data就是我们拖放时的实际数据,我们使用DragDrop.DoDragDrop()方法启动拖放操作,将数据带入拖放操作中。 接下来,我们实现放置操作,将拖放的数据放置到相应的控件上。所以我们首先要设置放置对象的AllowDrop=”True”属性,让其具有可以放置的特性,接着实现放置控件的DragOver(拖动完成),Drop(放置)事件。代码如下: 我们在DragOver中判断拖动中的数据数据类型是否是我们放置的数据类型,如果不是则停止拖放。我们在Drop事件中将对象放置,即完成所有拖放操作。通过上面代码可以很好的完成一些简单拖放,后面我们会介绍,拖放时如何让对象跟随鼠标等效果。 代码下载
关于WPF绑定机制,给我们带来了很大的方便,我们都了解在WPF绑定中使用XAML方式可以这样做,代码如下: 但是如果在cs文件中如何进行控件的绑定呢?看下面代码: 从上面代码可以看出,WPF用代码的方式也能很好的进行绑定操作。如果我们要执行双向绑定,或者设置Converter的时候怎么办呢?我们只要设置Binding的这两个属性Binding.Converter,Binding.Mode就可以了。
在WPF开发中,WPF给了我们很好的关于键盘的支持,不过,我在开发测试中发现,使用WPF内置的方式判断组合键会造成反应低下,如Ctrl+A组合键,如果用wpf自己的组合键判断方式,如: 如果,我们的客户在很快的情况下,按下组合键,会造成无效,为了解决这个问题使用Win32 API做个键盘钩子,在google中搜索,偶然发现,老外,给我们写了现成的关于Win32键盘监听的类。我们只要使用这个类就能判断用户的键盘事件。从而达到快速反应键盘事件的方式,次代码对WinForm同样有效。代码如下: 使用时,我们只要new KeyboardHook()对象,并且实现它的KeyDown事件就可以了。判断的时候要使用WinForm的类库。
WPF当窗体WindowStyle=”None”时,最大化会覆盖掉任务栏。如何解决这个问题呢?要用到Win32 API,通过让WPF窗体WM_GETMINMAXINFO消息挂接一个钩子来处理。 代码如下: 通过调用WindowHelper.RepairWindowBehavior(Window)方法注册Win32消息事件,以后调用this.WindowState = WindowState.Maximized;就可以解决最大化避免覆盖任务栏的问题了。
Silverlight/WPF中有3个强大的布局控件,StackPanel、Canvas、Grid,从字面上理解,StackPanel是一种堆的布局,就是一个挨着一个的布局方式;Canvas是一种基于画板的布局方式,我们把控件放到面板上定义好坐标,这点跟Html中的Div布局类似,只是所有Div的Position都是相对定位的;Grid是一种表格方式的布局,这点很像是Html中的表格布局,把控件一个一个的放在表格里。 下面我们一一进行讲解: 1.StackPanel布局 StackPanel是一种堆的布局方式,其中Orientation属性,决定是水平排列,还是垂直排列,下面例子垂直排列 结果: 垂直排列改为: 结果: 2.Canvas布局 Canvas是一种基于面板的布局方式,我们需要设置好Canvas.Top,Canvas.Left,Canvas.ZIndex属性,即相对面板的顶端距离,左端距离和显示顺序,因为这种布局是绝对定位的,需要设置好Canvas面板的高度和宽度 结果: 3.Grid布局 Grid布局是一种基于表格的布局方式,这种方式更为灵活,可以处理复杂的布局方式,其中要先定义行和列,再设置Grid内控件的Grid.Row和Grid.Column属性,即该控件在表格的第几行,第几列,其中Grid.RowSpan和Grid.ColumnSpan属性分别为跨行和跨列,和Html相似。 结果: Silverlight/WPF给我们提供了非常强大灵活的布局方式,我们要灵活运用这三种布局方式实现更为复杂的布局。
MVVM模式大家应该不陌生吧,陌生的快来看看,可是WPF/Silverlight开发中,必备的设计模式。 MVVM模式解决了,我们在开发WPF/Silverlight应用程序过程中产生的业务层、表示层比较混乱问题,使表示层和业务层完全分离。 早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expression Blend。 从上图可以看出来,View表示层就是我们通常的XAML,用来表示前台界面,ViewModel视图模块层的作用用来连接业务逻辑和视图层的关键部分,通常我们发出的命令或者事件都是通过这层传送给业务逻辑层的,Model就是我们的实际数据,业务逻辑代码等。 下面我们用一个Silverlight简单例子来讲解MVVM模式 这个程序就是实现简单查询,输入ID号,查询符合结果的内容