我的WPF

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mr_henry_love/article/details/80689051

我的WPF 学习笔记

1. Button的点击事件在代码中即使是私有的也没有关系, 一样可以用的. 因为在XAML 文件中的x:class 中已经表明了当前xaml所对应的class类, 所以私不私有都无所谓的.

2. 如果报此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的话, 就是修改注册表中的一个值就好了, 百度一搜就有. 然后重启

3. 如果是要用XamlReader 读取xaml的话, 必须保证这个xaml是utf-8 无bom格式的, 不然的话就会报错:给定编码中的字符无效. 这个xaml的root也要有xmlns 这样的属性说明, 不然的话也是无法解析的, 读取xaml的话好像是不能读取Click的, 不知道为毛

4. LogicalTreeHelper.findLogicalNode(root, name) 可以在一个xaml的根元素中一路往下找, 找到与这个名字所匹配的子元素.

5. Window设置ResizeMode=NoResize 的话, 这个窗口的大小就不能调整了

6. 一个容器要响应MouseEnter事件,例如StackPanel的话, 只会显示容器上方有东西的区域, 或者是有背景的区域

7. 要想让TextBox可以输入多行文本, 可以添加两个属性, 一个是TextWraping=”wrap”, 这样在输入的文本在一行中已经满了之后, 就会到下一行, 有必要的话会扩展, 另一个属性是acceptreturn=true, 这个属性好像是可以让文本换行的时候更智能一点, 例如每一行都会尽量填满, 还可以再加一个属性叫做verticalscrolbarvisibility=”true”, 这样的话,可以使得内容可以滑动,

8. Rectangle 没有background的属性, 但是有fill这个属性, 效果好像是一样的, 都是用来设置背景的

9. Mouse.Capture(uielement) 可以把鼠标捕捉到这个UI元素, 作用就是例如,一个UI元素在监听mousemove事件, 正常情况下是如果鼠标离开了这个元素就监听不到这个事件了, 但是如果捕获了的话就可以继续监听这个事件了

10. Textbox可以直接通过拖拽的方法接受文本

扫描二维码关注公众号,回复: 3932586 查看本文章

11. MouseDown的时候调用DragDrop.dodragdrop(dependencyobject , data, dragdropeffects) 就可以拖拽了, 在目标对象上设置allowdrop, 然后设置drop方法, 在drop方法中处理, 拖拽源到了自己身上的时候怎么处理

12. WPF中设置background 是用brush对象

13. 控件在设置字体的时候,. 用FontDamily属性, 这个属性后面可以跟多个字体, yahei,arial,songti, 意思就是如果支持雅黑就是雅黑, 没有雅黑字体就用arial, 一直往下匹配

14. Textdecorations 有四种选择, overline 在文本的头部划线, strikethrough 直接穿过中间划线, underline在下面划线, baseline也是下划线, 说实话underline和baseline 没看到太大的区别

15. 引用外部自己添加的ttf的字体使用fontfamily=”./#名字” 不带后缀的名字

16. 每一个UI元素都可以设置cursor属性, 这个属性就是当鼠标进入这个UI元素的时候显示的样子, 例如wait就是鼠标转圈的那个显示, 有很多种选择的, 可以在代码中设置也可以在xaml中设置

17. 每一个元素都有tooltip属性, 下面可以定制tooltip, 在鼠标进入这个控件的时候就会触发, 然后就会显示tooltip, 或者tooltip属性字节赋值为一段字符串也是可以的. 可以设置tooltip出现的位置, 首先设置placement =”Mouse”, 意思是tooltip弹出的地方参照鼠标, horizontaloffset 的意思就是说基于鼠标的位置往右边便宜具体多少个像素

18. Content只能设置一次, 但是如果里面想放多个东西, 可以在里面放一个布局容器就好了. 例如button上放一张图片, 再放一个文本之类的

19. Horizontalcontentalignment 意思就是内容的对齐方式, horizontalalignment就是这个控件在容器中的对齐方式

20. Label的绑定可以使得在按下快捷键之后, 把焦点放到指定的ui元素上去

21. 按钮的isCancel属性设置为true的话, 那么在按下escape键的时候, 也会触发点击事件,  不仅如此, 这个按钮的点击事件被执行之后, 下面就是退出窗口了, 就算他的点击事件只是弹个消息框, 在确认消息框或者X掉消息框之后, 这个窗口程序也就退出了

22.  如果一个按钮设置了IsDefault属性为true的话,那么在按下enter键的时候就会执行他的点击事件, 不论当前的焦点在哪.

23. Checkbox可以设置三中的选中状态, 分别是选中, 未选中和未确定, 但是要设置为三种状态的话,要设置一个属性, isthreestate=true才可以

24. 在同一个容器内的radiobutton会只有一个可以被选中, 这个时候可以不设置groupname, 但是如果是在不同的容器中的radiobutton也想做到只有一个被选中的话, 就要设置groupname了

25. Popup一直跟随鼠标的话就是, 就是在鼠标移动的时候, 让这个popup.isopen=false, 然后再设为true. 就好了

26. ScrollViewer 就相当于是android中的scrollview 一样都是可以让内部的内容超出之后就可以滚动. 可以设置滚动条的可见性, 如果是auto的话就会根据内部的内容自动隐藏显示, 如果是visible的话就是可见, hidden和disable都是不可见, 似乎没发现别的区别了, 好像资料又说disbale的话是会内容都无法拖拽, 感觉不太正确. 即使设置visible, 中间那个可以滚动的条也是按照内容来显示的, 上下,或者左右那两个固定不动的三角才是确定会显示的

27. ScrollViewer.lineup() 就是相当于点击了滑动条的上面那个三角形, 会让内容往上一些. PageUp 的话就是相当于一次性滑动一个屏幕, 而不是一行. 还可以scrolltohome 滑动到顶部, scrolltoend 滑动到底部, 如果横竖都超出内容的话, 那么这个方法会滑动到最右下角或者是最左上角

28. 对于ScrollViewer中包含的容器来说, 如果他事先了iscrollinfo接口, 同时把scrollviewer 的cancontentscroll设置为true的话, 那么点击上三角或者是下三角的时候就会一次性滑动一个元素而不是一行或者一列之类的

29. 代码切换tabitem很简单, this.tabitem.isslected=true, 这样就好了, 就切换到了指定的这个tabitem了, tabitem是一个选项卡, 上面套一个tabcontrol, tabstripPlacement 用于设置选项卡放置在哪,设置为左边就是左边垂直, 设置为top就是顶部水平,

30. Window有一个sizetocontent= 可以选择宽,高或者宽高, 意思就是让这个窗体的宽高匹配内容.

31. Expander 是一个圆形的内部带三角箭头的. 点击可以展开内容,再点击就收起内容的控件.

32. Expander  有一个expanddirection属性, 这个就是扩展的方向, 如果是上的话也就是说点击之后展开的内容在上面,.

33. Textbox 的wrapingmode 如果设置为wrapwithoverflow 的话意思就是必须要有空格才会换行, 如果没有的话不换行, textbox本身就有verticalscrollbarvisibility这个属性.然后就可以设置滚动了, , textbox 拥有很多scrollviewer 一样的功能, 例如lineup, linedown,pageup, scrolltohome 之类这些方法.

34. Textbox有selectionstart, selectionlength和selectedtext方法, 用于记录鼠标选中的文本, 另外就是selection_changed 这个方法是很早就会执行的,, 如果在这个方法执行的时候要用倒别的控件的话, 要做非空判断哈, 还有个spellcheck.isenabled 的属性,  这个是用于对文本内容进行检查的, 但是这个是对系统的默认输入法好像是有要求的, 同时这个好像是只对英语, 法语,德语,西班牙语做检查

35. Passwordbox 跟textbox在使用上差不多, 不过这个是不论你输入什么都会显示一个指定的字符, 可以通过passwordchar 来指定显示的是什么字符

36. ListBox 的条目是可以不需要一定要ListBoxItem的, 可以直接写入要添加进去的标签就好了

37. ListBox中的条目如果也是可以抢夺焦点的话, 那么点击条目可能是不会执行listbox的selectionchanged事件的, 例如点击到checkbox,textbox就不会执行, 只能点击这一条的外面. 但是textblock就不会, 因为这个是不会抢夺焦点的

38. WPF 中也有slider 控件是一个滑块,  可以设置maximum,minimum 用于确定最小和最大值, tickplacement 用于设置刻度, 还可以通过Ticks 自定义在某些位置画刻度.

39. Slider 中可以通过设置isselectionrangeenabled为true之后, 就可以通过selectionstart和selectionend 属性确定绘制阴影的部分, 可以通过设置smallchange 这个属性确定最小移动的单位, 例如最小一次性移动2个单位, 或者其他指定个数的单位. 还有一个largechange属性这个是设置大变化的属性, 例如点击滑动条的空白处.执行的就是largechange. 可以用valuechanged 获取到slider的当前位置

40. Progressbar的使用和slider好像差不太多.一样是设置minimum和maximum 的, 通过设置value来设置当前的进度. 如果progressbar 的isindeterminate 设置为true的话,那么进度就不是自己控制了, value也没有任何意义了, 他会自己不停地移动,重复. 通过设置background和foreground来设置前景和背景的颜色

41. WPF 中的日期控件其中之一是calendar, 有一个属性叫做displaymode 默认是month也就是按照月来显示, 意思就是会显示每个月里面的每一天,. 如果改成year 的话意思就是会按照年来显示, 意思就是现实每一年的每一个月, 但是点击那个月之后又会显示这个月的所有信息. Displaydatestart和displaydateend是设置这个日历显示最早的一天和最后的一天

42. Firstdayonweek 是可以设置这个日历中第一列显示的是星期几.默认是星期天, 有selecteddatechanged 这个函数用于实时捕捉当前选中的日期. 有个selectionmode属性, 这个可以设置可以选择多少个日期, singledate 单个日期,singlerange单个连续的日期段. Multiplerange 多段连续. Istodayhighlighted=false的话那么今天就不会高亮, 默认是true 也就说不管你选了哪一天,今天都是高亮的

43. Datepicker 除了可以点击弹出日历选择日期之外, 还可以手动输入日期,有一个回调方法就做Datevalidationerror , 当输入的时期不合法的时候调用

44. App.xaml中的startupuri 就是指定了启动的时候打开的窗口,改变这个就可以任意指定启动窗口. 在application的xaml中有一个属性叫做:shutdownmode 就是程序退出的模式, 可以选择OnLastWindowclose 最后一个窗口关闭, OnMainwindowclose , 主窗体关闭. OnExplicitShutdown 意思就是不会关闭, 除非强制关闭.强制关闭的方法是Application.current.shutdown();

45. 在工程中导入一张照片,设置属性为splash screen 意思就是在启动第一个窗口之前, 让这张图片成为欢迎界面

46. System.IO.File这个类直接就有读取文件中所有文本的方法File.readALLTEXT(path);

47. Application.xaml中可以指定startup事件, 也可以在这里处理第一个启动的窗口.

48. WPF 中窗口的show和showdialog是不一样的, 如果是show的话, 也就是说不会影响原来的程序执行. 例如在弹出的时候,如果他下面有代码, 那么下面的代码也会一样的执行, 但是如果是showdialog方式的话,那么在弹出这个框之后会中断原来的窗口, 只有当这个窗口结束之后才会执行后面的代码

49. 通过Application.current.mainwindow 可以获取到当前应用程序的主窗口

50. Windows 应用程序中第一个启动的窗口就是主窗体. 通过Application.current.windows 可以获取到所有打开的窗口.

51. 一个window如果设置了owner 的话,那么当owner关闭了之后,那么他也关闭了

52. 启动窗口程序必须是用Application.run方法, 不可以直接调用window.show, 不然的话就会一闪而过.

53. 创造单例windows应用程序, 如果没有设置过的话, 一般的windows应用多次启动的时候实际上创建了多个进程, 要创建单进程, 单实例的应用可以按照下面这种操作, 首先是建一个类继承Microsoft.VisualBasic.ApplicationService.WindowsFormApplicationBase, 然后在构造方法中调用isSingleInstance=true, 然后重写bool OnStartUp方法, 这个是第一次启动的时候会调用的方法, 在这里创建application的对象, 显示窗口, 然后再重写OnStartUpNextInstance方法, 在这个方法里面的话就不创建Application对象了, 直接显示窗口就可以了.  然后创建一个类在main方法中创建这个单例类的对象调用run方法就好了.

54. 在使用Image的时候只有把图片添加进项目作为resource资源, 然后引用, 这个时候这张图片才会嵌入进exe. 也就是说编译后即使在外面删掉这个图片也是没有关系的了. 如果把资源设置为内容, 同时复制选项设置为始终复制, 那么在编译的时候, 就会在相对路径的位置复制一份这个资源. 这个时候exe里面没有包含这个资源, 但是只要资源和exe的相对路径是保持一致的就能够找到这张图片. 当然 这种情况下是不可以删除的.

55. 数据绑定:格式如下例如一个textblock的fontsize属性绑定跟另一个目标控件的某个属性在一起. 写法如下fontsize=”{binding elementname=目标名字,Path=目标属性, mode=绑定模式}” 正常情况下好像是改变目标的fontsize属性不会改变源控件的属性, 但是改变原控件的属性会改变textblock的fontsize属性. 如果设置mode=taoway的话就可以了. 这个也是可以用代码来写的, 创建一个binding对象, 设置source, path.mode, 然后目标调用setbinding方法, 传入绑定属性和binding对象就ok了

56. 方法中调用BindingOperation.clearAllbindings(this.textblock) 这样的话就可以取消掉这个控件的所有绑定. 调用BindingOperation.clearBinding(控件, 属性) 这样的话就可以单独只取消这个控件上这个属性的绑定

57. 如果是绑定属性的属性的话用点.符号来确定. 例如绑定ListBox中被选中的条目的tag, 可以写path=SelectedItem.Tag, binding还有个属性updatesourcetrigger, 如果设置成propertychanged 的话意思就是属性发生变化的时候,就会目标就会更新. 不然的话对于一些有焦点的控件的话会等失去焦点才可以更新.

58. slider的issnaptotick设置为true的话, 就可以使得slider滑块的值只能是按照tick的幅度来变化, 例如tick设置为1, 那就是每次变1. 也就是只能是整数,

59. 资源绑定外部静态变量, 例如: text={binding source={x:static SystemFonts.IconFontFamily},path=Source} 意思就是文本内容等于SystemFonts.IconFontFamily.Source 这个值. 如果是引用在windows中定义了的资源. 可以这样绑定text={binding source={staticresource font}}, 其中font是在window.resource定义的资源的键

60. 这个是用来绑定父容器中的某个属性.

61. 在通过ancestorlevel来绑定父容器的时候, 是从里往外找的, 1就代表第一个, 也就是离自己最近的那一个. 2 是稍微外面那一层的那一个.

62. 如果出现绑定多个使用同一个source的话, 那么可以在他们的父容器中统一用dataContext, 这样的话他们本身只有Path没有source 就会在父容器中找, 从里往外知道找到为止.

63. 可以在控件中使用在windowresource下面定义了的资源, 例如ImageBrush画刷, 可以设置TileMode平铺模式, 如果None的话,就不会平铺原来是多大就多大, 设置平铺的话就会重复多个一直铺满, TileMode 如果是Flipx的话就是在x轴上镜面反射

64.  这样就是创建了一个资源字典, 同时把这个资源字典合并到application中, 这样这个应用程序的各个地方都可以用这个资源了, 而且很好用, 直接用这个resourcedictionary中的key就好了

65. 要让一个窗口再启动的时候就是全屏的话, 最好是在application的startup回调方法中就设置窗口的宽高为SystemParameters.PrimaryScreenWidth, 以及PrimaryScreenHeight 就好了

66. Path类也是一个用于做各种形状和路径的类, 用法如下: Path 设置fill, stroke, margin 等等下面放一个Path.Data, Data里面放Geometry的对象, 这个就是最终被绘制出来的样子, 注意的是Data下面只能好像放一种Gemeotry或者geometrygroup, 但是GeometryGroup下面是可以放多个Geometry的. GeometryGroup 也是可以作为一个Window.Resources资源存在, 然后可以在其他标签引用.

67. GeometryGroup中有一个属性叫做FillRule 填充规则, 有nonezero和evenodd 的选项, 前面这一个是让这个group里面的多个geometry都受同一个颜色渲染, evenodd的意思 则是让交接的部分变成一个空洞,

68. combineGeometry 下面可以放多个geometry, 可以通过设置GeometryCombineMode 来设置 内部包含的多个Geometry的绘制方式, 包括Union, 合并, 就是两个几何图形合起来, exclude 就是第一个全部包含之后再去掉第二个图形., xor 就是合并起来之后再去掉交叉的部分.interectset就是只绘制交叉部分.

69. PathGeometry 下面可以放一个pathfigure, pathfigure 下面可以放各种例如lineSegment线, arcSegment 曲线 等等之类的 在pathfigure中确定一个startpoint 起点, 在linesegment中确定一个点, 然后就会连接. 在arcsegment中可以设置一个pointm,同时再设置一下size=”40,30” 这个就是这条曲线该怎么曲的. islargearc 可以设置曲线是延哪个方向来画.

70. 还可以使用Beziersegment 贝塞尔曲线, 只要确定三个点. 不包括起点

71. 可以使用微语言类设置一个path, 这个很简单的, 就是在path中的data属性这样写Data=”M10,10 L200,40 L300,0 Z” M 代表是起点,L 是线上的点, Z代表封闭, 不写Z 的话就是不封闭.

72. 一个元素可以使用clip来进行裁剪, 例如一个文本, 或者一个图片, 使用clip属性, clip值引用为一个geometryGroup都可以

猜你喜欢

转载自blog.csdn.net/mr_henry_love/article/details/80689051
WPF
今日推荐