Wpf常见例子实现及演示

2021-09-27

前言

整理了一下Wpf常见例子,以作备用,Demo项目地址:logerlink/WpfCommonDemo: Wpf常见例子,自定义弹出框、文本框、全局异常捕获、避免软件多开、converter过滤器 (github.com)

自定义弹出框

思路:新建一个页面作为弹框,需要弹框的时候,计算当前窗口的真实宽高以及左上角的坐标位置,将宽高和位置信息设置给弹框页面达到覆盖本窗口的效果.

loading展示22

wpf自定义头部,标题栏,Closing事件

使用场景:当我们需要自定义标题栏的颜色或者添加自定义的内容时

隐藏窗体自带的标题栏:WindowStyle="None" AllowsTransparency="True"

已知问题:

  1. 窗口最大化时无法通过拖拽标题栏实现窗口最小化操作
  2. 必须要设置 ResizeMode="CanResizeWithGrip" 才能改变窗口大小 而且只能在右下角触发(右下角会有一个图标)
  3. 默认窗体没有边框也没有边框阴影

若我们要关闭主窗口时需要先判断子窗口是否存在,若存在先关闭子窗口,这一系列操作可以在主窗口的Closing事件中处理.

自定义标题栏

xaml:

xaml.cs

wpf自定义图标 ,如何使用svg

wpf如何设置style?单个设置,样式继承、全局设置,外部style,样式触发事件

StyleDemo

单个设置

内联样式,仅该元素使用的样式

全局设置、指定设置

该区域的某元素(Button)都使用的样式,注意不要设置key值

BasedOn:表示继承 ,可继承于wpf默认样式 BasedOn="{StaticResource {x:Type Button}}" ,也可继承于其他样式:BasedOn="{StaticResource btn_four_style}"

Key:设置key值之后如果需要用这个样式,需要再相应元素上指定,如:Style="{StaticResource btn_four_style}"

外部资源样式

App.xaml中指定外部样式资源文件

设置Style时,外部资源要用 DynamicResource 绑定,内部用 StaticResource

Trigger样式触发

当我们想让某元素鼠标悬浮、点击、选中时呈现不同的形态,我们可以使用Trigger来处理

常见Textbox

image-20210925165023257

Textbox加水印 (waterMark、placeHolder)
滚动条、自动换行
文本框内加按钮如:清空按钮

xaml

xaml.cs

实现密码框

xaml

xaml.cs

鼠标聚焦自动全选文本

参考: WPF TextBox 获得焦点后,文本框中的文字全选中_weixin_34293911的博客-CSDN博客

xaml

xaml.cs

Popup跟随窗体移动

已知问题:Popup 一直置顶,预解决方案:窗体失去焦点时,把 Popup 的 IsOpen 属性改为 False ,不过比较麻烦且鸡肋。网上有扩展可以实现,不过还没试,参考:让WPF的Popup不总置顶的解决方案 - Leaco - 博客园 (cnblogs.com)

Popup

xaml

xaml.cs

全局捕获异常

减少未处理的异常导致软件闪退的情况,并作日志记录

全局异常

App.xaml.cs 重写 OnStartup 方法

以下是测试异常代码

xaml:

xaml.cs

避免软件多开

App.xaml.cs 重写 OnStartup 方法

测试:打开两次软件看看能不能成功打开

查找父、子元素

xaml

xaml.cs

打开资源文件

更多请参考:C# Process.Start()方法详解 调用其他exe 程序_大佛爷的博客-CSDN博客

获取各网站的 favicon、获取 bitmapFrame

xaml

xaml.cs

Converter过滤器

常用于状态值转换与判断,如数据库存储 [0,1,2] 页面上需要显示 [成功,失败,未知],或者根据状态值显示不同的颜色:0--blue,1--red,2--black 等等,如果用过vue,可以理解为vue的过滤器

ConverterParameter:传递过滤器的参数,如转换时间时,可以把时间格式(yyyy-MM-dd HH:mm:ss)传入,需要注意的是 ConverterParameter 不是依赖属性 所以不能用 Binding 来绑定值,如果非要处理两个绑定值的话,用 MultiBinding 来处理

下面主要介绍Converter基本使用,converter 携带参数(ConverterParameter),converter 携带多参数(MultiBinding),converter 绑定父元素的属性(绑定父组件的值演示)。

Converter演示

xaml

xaml.cs 构造函数绑定数据源

SpConverterVM:WpfCommonDemo/SpConverterVM.cs at main · logerlink/WpfCommonDemo (github.com)

StateConverter.cs 过滤器逻辑(核心)

Page和Frame实现页面切换

首先常见的页面切换可以分为两种:TabControl、(Page+Frame),由于 TabControl 简单易用,这里就不多介绍了。主要介绍一下Page,主程序也是用(Page+Frame+反射)实现的,我简单举个页面来讲一下吧

Frame元素设置 NavigationUIVisibility="Hidden" ,关闭默认的导航栏

(Page+Frame)切换时,会重置 Page 的内容。(如在page1填了表单,切换到page2,再切回page1,这时候page1的表单已经重置了)如果不希望切换菜单时重置Page,那么我们可以用一个字典把我们的Page暂存一下。

Frame 的 Navigate 方法会重置 Page 内容。

PageFrame

xaml

xaml.cs

Invoke和BeginInvoke

为什么要用 Invoke 和 BeginInvoke ? 当我们在执行程序逻辑时,需要持续更改UI的显示(如更新进度条),这个时候如果直接修改UI,就会造成UI假死的情况,只会显示最后结果.

Invoke展示

xaml

xaml.cs

常见问题

当前上下文中不存在名称"InitializeComponent"

解决方案:xaml和xaml.cs的命名空间不一致,改为一致就可以了

image-20210908175426784

Wpf自定义窗体标题栏顶部出现白边

这是因为设置了 WindowStyle="None" 的缘故,去掉白边需要再加上 AllowsTransparency="True" ,至于下文说的 借助 WindowChrome 来处理 ,我大概试了一下,没用,不知道是不是我实现有问题。

wpf窗口顶端白边问题已解决博问_博客园 (cnblogs.com)