WPF-基础及进阶扩展合集(持续更新)

目录

一、基础

1、GridSplitter分割线

2、x:static访问资源文件

3、wpf触发器

4、添加xaml资源文件

5、Convert转换器

6、多路绑定与多路转换器

二、进阶扩展

1、HierarchicalDataTemplate

2、XmlDataProvider从外部文件获取源

3、TextBox在CellTemplate中的焦点问题

4、让窗体可裁减

5、ScrollViewer自动滚动到尾部

6、wpf的Behavior行为

8、Cursor光标属性

9、ListView布局、滚动条

10、DataGrid文本过长换行

11、指定字体集FontFamily

12、窗体可拖动


一、基础

 了解更多控件介绍请点击:官方文档查询

1、GridSplitter分割线

将分割线加入Grid某行或某列,用户即可通过拖拽改变行或列的尺寸。

 垂直拖拽,示例:

<Grid><Grid.RowDefinitions><RowDefinition Height="*" /><RowDefinition Height="3" /><RowDefinition Height="*" /></Grid.RowDefinitions><hc:TextBox Background="LightGray" /><GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" /><hc:TextBox Grid.Row="2" Background="LightBlue" /></Grid>

水平拖拽 ,示例:

<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="3"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><hc:TextBox Background="LightGray" /><GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" /><hc:TextBox Grid.Column="2" Background="LightBlue" />
</Grid>

2、x:static访问资源文件

 注意:资源文件访问权限须更改为Public

            <TextBlock x:Name="tBk"Height="50"Background="LemonChiffon"Text="{x:Static prop:Resources.Gear}" />


3、wpf触发器

三类型:  属性触发器、数据触发器、事件触发器

使用场景:

        样式:Style.Triggers

        数据模板:DataTemplate.Triggers

        控件模板:ControlTemplate.Triggers

        元素中定义触发器:FrameworkElement.Triggers  //仅支持事件触发器,否则报错

      <Style TargetType="Button"><Setter Property="Background" Value="Gray" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border Background="{TemplateBinding Background}"BorderBrush="Black"BorderThickness="1"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /></Border><ControlTemplate.Triggers><Trigger Property="IsMouseOver" Value="true"><Setter Property="Background" Value="LightGreen" /></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style>

4、添加xaml资源文件

pack://application:,,,  可省略 

    <Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml" /><ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml" /></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>

5、Convert转换器

①继承IValueConverter接口(Convert方向为Source->Target,ConvertBack反向)实现一个转换器,示例如下:

    public class BoolToColorConvert : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is true) return Brushes.LightBlue;else return Brushes.LightGreen;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotImplementedException();}}

②新建一个转换器资源对象,与Binding绑定,如下:

<Grid.Resources><convert:BoolToColorConvert x:Key="myconv"/>
</Grid.Resources>  
<TextBox Background="{Binding IsCheck,Converter={StaticResource myconv}}" Text="{Binding IsCheck}" />

6、多路绑定与多路转换器

注意:MultiBinding必须实现转换器

实现IMultiValueConverter接口的多路转换器,示例如下:

    public class MultiConvert : IMultiValueConverter{public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){var high = values[0].ToString();if (values[1] is true)return $"{high}   true";else return $"{high}   false";}public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){throw new NotImplementedException();}}
<Grid.Resources><convert:MultiConvert x:Key="mconv" />
</Grid.Resources>
<hc:TextBox><hc:TextBox.Text><MultiBinding Converter="{StaticResource mconv}"><Binding ElementName="tbox" Path="Width" /><Binding Path="IsCheck" /></MultiBinding></hc:TextBox.Text>
</hc:TextBox>


二、进阶扩展

1、HierarchicalDataTemplate

HierarchicalDataTemplate:助层级控件(TreeView、MenuItem)显示层级数据模板

     注意:若结点为同类型(同节点名、同属性名),使用一个Template就行,会自动迭代;

                可通过路由事件方式取出XML数据;

    <Window.Resources><XmlDataProvider x:Key="xdp" XPath="School"><x:XData><School xmlns="" Name="魔法学院"><Grade Name="一年级"><Class Name="一班" /><Class Name="二班" /></Grade><Grade Name="二年级"><Class Name="一班" /><Class Name="二班" /></Grade></School></x:XData></XmlDataProvider><HierarchicalDataTemplate DataType="School" ItemsSource="{Binding XPath=Grade}"><TextBlock Text="{Binding XPath=@Name}" /></HierarchicalDataTemplate><HierarchicalDataTemplate DataType="Grade" ItemsSource="{Binding XPath=Class}"><RadioButton Content="{Binding XPath=@Name}" GroupName="gp" /></HierarchicalDataTemplate><HierarchicalDataTemplate DataType="Class"><CheckBox Content="{Binding XPath=@Name}" IsThreeState="True" /></HierarchicalDataTemplate></Window.Resources>

2、XmlDataProvider从外部文件获取源

 代码如下:

        <Grid.Resources><XmlDataProvider x:Key="xmldata"Source="Xml/mydata.xml"XPath="ArrayOfJsonTest" /></Grid.Resources><ListBox Height="80"d:ItemsSource="{d:SampleData ItemCount=3}"Background="LightYellow"BorderBrush="DarkOrange"BorderThickness="3"ItemsSource="{Binding Source={StaticResource xmldata}, XPath=JsonTest}"><ListBox.ItemTemplate><DataTemplate><Border BorderBrush="DarkOrchid" BorderThickness="3"><StackPanel Width="200"Height="30"Orientation="Horizontal"><TextBlock Width="NaN"Margin="5"Text="{Binding XPath=Name}" /><TextBlock Width="NaN"Margin="5"Text="{Binding XPath=Value}" /><TextBlock Width="NaN"Margin="5"Text="{Binding XPath=Id}" /></StackPanel></Border></DataTemplate></ListBox.ItemTemplate></ListBox>

3、TextBox在CellTemplate中的焦点问题

当使用GridView作为ListView的View属性时,若某一列使用TextBox作为CellTemplate,那么TextBox获取焦点时目标控件并不会把该项作为SelectedItem

解决方式:通过TextBox的GotFocus事件的事件处理器去追溯到目标控件,获取业务逻辑数据,并将其设置为选中项;

/*********访问业务逻辑数据***************/

TextBox tb=e.OriginalSource as TextBox;//获取事件发起的源头

ContentPresenter cp=tb.TemplateParent as ContentPresenter;//获取模板目标

Student stu=cp.Content as Student;//获取业务逻辑数据

this.listViewStudent.SelectedItem=stu;//设置ListView的选中项

/****************访问界面元素*************************/

ListViewItem lvi=this.listViewStudent.

                itemContainerGenerator.ContainerFromItem(stu) as ListViewItem;//通过条目容器自上而下寻找

CheckBox chb=this.FindVisualChild<CheckBox>(lvi);//借助VisualTreeHelper封装的方法

MessageBox.Show(chb.Name);

注意:寻找DataTemplate生成的控件,若结构简单可使用DataTemplate对象的FindName方法,对于结构复杂的控件,只能借助VisualTreeHelper来实现了。 

4、让窗体可裁减

前提:窗体AllowsTransparency属性设为true

                  WindowStyle属性设为None

再使用Clip方法裁剪,指定一个裁剪路径

5、ScrollViewer自动滚动到尾部

通过ScrollChanged路由事件实现该功能:

private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e){var scrollViewer = (ScrollViewer)sender;// 检查是否已滚动到底部bool isAtBottom = scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight - 1;// 如果已滚动到底部,自动滚动到底部if (isAtBottom){try{scrollViewer.ScrollToBottom();}catch{// ignored}}}

6、wpf的Behavior行为

引用System.Windows.Interactivity库

使用事件触发行为

<Button Width="90"Height="90"Background="LightBlue"Content="Ok"FontSize="30" ><i:Interaction.Behaviors><inter:MyBehavior/></i:Interaction.Behaviors>
</Button>
    public class MyBehavior:Behavior<Button>{protected override void OnAttached(){base.OnAttached();AssociatedObject.Click += AssociatedObject_Click;}private void AssociatedObject_Click(object sender, RoutedEventArgs e){AssociatedObject.Background = Brushes.LightGreen;AssociatedObject.Content = "Green";}protected override void OnDetaching(){base.OnDetaching();AssociatedObject.Click-= AssociatedObject_Click;}}

导航:

1、NavigationService.GoBack();  //向下,使用前判断CanGoBack()

2、NavigationService.GoForward();  //向上,使用前判断CanGoForward()

3、NavigationService.Navigate(new Uri("Page3.xaml", UriKind.RelativeOrAbsolute));//导航

使用方法1:

  <TextBlock x:Name="tblk" Background="LightGray"><Hyperlink Click="Hyperlink_Click" NavigateUri="https://cn.bing.com">BiYin</Hyperlink></TextBlock>
 private void Hyperlink_Click(object sender, RoutedEventArgs e){Hyperlink hyperlink = (Hyperlink)sender;Process.Start(new ProcessStartInfo(hyperlink.NavigateUri.AbsoluteUri));//Process.Start(new ProcessStartInfo("https://www.csdn.net/"));}

使用2:结合Page使用

                <Frame x:Name="fram"Height="200"Source="Page1.xaml" />

this.fram.Navigate(new Uri("Page2.xaml", UriKind.RelativeOrAbsolute));

8、Cursor光标属性

FrameworkElement的属性,可设置控件区域光标的不同状态

9、ListView布局、滚动条

1、ItemsPanel:可设置数据项布局水平或垂直

2、ItemContainerStyle :设置每个项的样式,

                                BasedOn:继承指定对象

3、Template:可通过模板给无ScrollViewer功能的容器添加ScrollViewer

                1、ScrollViewer控件:封装了水平、垂直ScrollBar和一个内容容器

                2、ItemsPresenter:itemsControl不负责呈现控件,通过子元素ItemsPresenter负责,放在模板内部,该子元素会检测其父元素是否为集合控件,若是则添至视觉树中
————————————————

更详细点击:
    转到示例

10、DataGrid文本过长换行

通过Column的ElementStyle设置TextBlock的属性如下(注意:Width属性必须设置后才有效)

,该方法会多显示一行,如果太长仍不能显示全部:

            <DataGrid.Columns><DataGridTextColumn Width="*"Binding="{Binding}"Header="Head1"><DataGridTextColumn.ElementStyle><Style><Setter Property="TextBlock.TextWrapping" Value="Wrap" /><Setter Property="TextBlock.TextAlignment" Value="Left"/></Style></DataGridTextColumn.ElementStyle></DataGridTextColumn></DataGrid.Columns>

11、指定字体集FontFamily

①添加字体资源文件;

②双击字体文件可查看字体名称;

③指定字体集;

<TextBlock Height="NaN"Margin="5"FontFamily="./Fonts/#Algerian"FontSize="40"Text="My Test" />

12、窗体可拖动

<Border Grid.ColumnSpan="2"Background="Transparent"ClipToBounds="True"CornerRadius="5 5 0 0"MouseLeftButtonDown="Top_MouseLeftButtonDown">
</Border>
        private void Top_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){if (e.LeftButton == MouseButtonState.Pressed) DragMove();}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统边界图

系统边界图的定义&#xff1a; 系统边界图是系统工程和软件工程中的一种图形化工具&#xff0c;用于描述系统与外部世界之间的交互和界限。它展示了系统的组成部分以及这些组件如何与外部实体进行通信和交互。系统边界图通常包括系统内部的各个组件、外部实体以及它们之间的通信…

大厂100 NLP interview questions外企

CLASSIC NLP TF-IDF & ML (8) Write TF-IDF from scratch. What is normalization in TF-IDF ? Why do you need to know about TF-IDF in our time, and how can you use it in complex models? Explain how Naive Bayes works. What can you use it for? How can…

考研数学究竟有多难?基础差该如何复习?

考研数学的难度是相对的&#xff0c;它取决于考生的数学基础、备考时间、复习效率和解题技巧等多个因素。从历年的考试情况来看&#xff0c;考研数学确实具有一定的挑战性&#xff0c;主要体现在以下几个方面。 首先是知识覆盖面广&#xff0c;考研数学涵盖了高等数学、线性代…

集群伸缩简介

4.2.1.小结 Redis如何判断某个key应该在哪个实例&#xff1f; 将16384个插槽分配到不同的实例根据key的有效部分计算哈希值&#xff0c;对16384取余余数作为插槽&#xff0c;寻找插槽所在实例即可 如何将同一类数据固定的保存在同一个Redis实例&#xff1f; 这一类数据使用…

推荐系统学习记录——连续的嵌入空间

连续嵌入空间 推荐系统通常会将用户和项目&#xff08;或商品&#xff09;表示为向量或嵌入&#xff08;embeddings&#xff09;&#xff0c;这些向量被映射到一个称为嵌入空间&#xff08;embedding space&#xff09;的数学空间中。在这个空间中&#xff0c;相似的用户或项目…

1042: 中缀表达式转换为后缀表达式

解法&#xff1a;直接给算法 创建一个栈和一个空的后缀表达式字符串。 遍历中缀表达式中的每个字符。 如果当前字符是操作数&#xff0c;直接将其添加到后缀表达式字符串中。 如果当前字符是操作符&#xff0c;需要将其与栈顶的操作符进行比较&#xff1a; 如果栈为空&#…

【Python标准库】多线程threading

1.多线程 让程序能够执行多个任务&#xff0c;比如下载多张图片&#xff0c;创建多个线程 2.多线程语法 # 1.导包 from threading import Thread# 2.创建任务即函数 def func_01():# 无参print("哈喽")def func_02(name):# 有参print(f"{name},您好")if …

Mac下载的软件显示文件已损坏,如何解决文件已损坏问题

当在Mac上下载的软件显示文件已损坏时&#xff0c;这可能是因为多种原因导致的&#xff0c;包括网络问题、下载中断、软件未完整下载、文件传输错误等。解决这个问题需要采取一些步骤来排除可能的原因&#xff0c;并尝试修复文件。下面将详细介绍一些常见的解决方法&#xff1a…

Qt-绘制多边形、椭圆、多条直线

1、说明 所有的绘图操作是在绘图事件中进行。mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWi…

【详解算法流程+程序】DBSCAN基于密度的聚类算法+源码-用K-means和DBSCAN算法对银行数据进行聚类并完成用户画像数据分析课设源码资料包

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。 与划分和层次聚类方法不同&#xff0c;它将簇定义为密度相连的点的最大集合&#xff0c;能够把具有足够高密度的区域划分为簇&#xff0c; 并可在噪声的空间数据…

linux监控文件操作行为

linux监控文件操作行为 使用 auditd 系统 auditd 是Linux系统的一个安全和审计系统&#xff0c;它能够跟踪系统上发生的安全相关事件。要使用 auditd 来监控文件&#xff0c;你需要首先确保 auditd 已经安装并且运行在你的系统上。 然后&#xff0c;你可以使用 auditctl 命令…

MES管理系统中生产物料管理的设计

在数字化工厂建设的浪潮中&#xff0c;MES管理系统作为执行层的核心管理系统&#xff0c;其重要性日益凸显。特别是在生产物料管理方面&#xff0c;MES管理系统不仅承担物料计划指令的接收&#xff0c;还负责物料派工及使用反馈的数据收集&#xff0c;其业务流程的设计对数字化…

【AI 测试】语言交互模型测评方案

语言交互模型 具体是指那些? 语言交互模型主要指的是用于实现人类与设备之间通过自然语言进行交互的模型。这些模型通常涉及多个关键组件和技术,以理解和生成自然语言,从而实现有效的交互。 具体来说,语言交互模型可以包括以下几个主要部分: 语音识别(ASR):将声学语音…

树莓派点亮双色LED

双色LED灯准确来说叫双基色LED灯,是指模块只能显示2种颜色,一般是红色和绿色,可以有三种状态 :灭,颜色1亮,颜色2亮,根据颜色组合的不同,分为红蓝双色,黄蓝双色,红绿双色等等。 接线:将引脚S(绿色)和中间引脚(红色)连接到Raspberry Pi的GPIO接口上,对Raspberry…

文献速递:深度学习胰腺癌诊断--胰腺肿瘤的全端到端深度学习诊断

Title 题目 Fully end-to-end deep-learning-based diagnosis of pancreatic tumors 胰腺肿瘤的全端到端深度学习诊断 01 文献速递介绍 胰腺癌是最常见的肿瘤之一&#xff0c;预后不良且通常是致命的。没有肿瘤的患者只需要进一步观察&#xff0c;而胰腺肿瘤的诊断需要紧…

Java面试题:解释Java的基本数据类型及其大小和默认值,列举数据类型常见的错误知识点

Java的基本数据类型是Java编程语言中用于存储简单值的类型。这些数据类型包括整数类型、浮点类型、字符类型和布尔类型。下面是对这些基本数据类型的详细解释&#xff0c;包括它们的大小和默认值&#xff0c;以及一些常见的面试中容易出错的知识点。 基本数据类型及其大小和默…

【数据结构与算法】递推

来源&#xff1a;《信息学奥赛一本通》 所谓递推&#xff0c;是指从已知的初始条件出发&#xff0c;依据某种递推关系&#xff0c;逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定&#xff0c;或是通过对问题的分析与化简后确定。 从已知条件出发逐…

计算机网络——应用层(3)电子邮件

电子邮件 1、概述&#xff1a; 电子邮件是使用电子设备交换的邮件及其方法。 优点&#xff1a;使用方便&#xff0c;传递迅速&#xff0c;费用低廉&#xff0c;可传送多种信息 重要标准&#xff1a; 简单邮件发送协议&#xff1a;SMTP互联网文本报文格式通用互联网邮件扩充…

leetcode717-1-bit and 2-bit Characters

题目 有两种特殊字符&#xff1a; 第一种字符可以用一比特 0 表示 第二种字符可以用两比特&#xff08;10 或 11&#xff09;表示 给你一个以 0 结尾的二进制数组 bits &#xff0c;如果最后一个字符必须是一个一比特字符&#xff0c;则返回 true 。 示例 1: 输入: bits [1, …

浏览器工作原理与实践--跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性

通过上篇文章的介绍&#xff0c;我们知道了同源策略可以隔离各个站点之间的DOM交互、页面数据和网络通信&#xff0c;虽然严格的同源策略会带来更多的安全&#xff0c;但是也束缚了Web。这就需要在安全和自由之间找到一个平衡点&#xff0c;所以我们默认页面中可以引用任意第三…