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.rhkb.cn/news/295616.html

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

相关文章

Python基础之pandas:文件读取与数据处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、文件读取1.以pd.read_csv()为例&#xff1a;2.数据查看 二、数据离散化、排序1.pd.cut()离散化&#xff0c;以按范围加标签为例2. pd.qcut()实现离散化3.排序4.…

stream使用

stream流式计算 在Java1.8之前还没有stream流式算法的时候&#xff0c;我们要是在一个放有多个User对象的list集合中&#xff0c;将每个User对象的主键ID取出&#xff0c;组合成一个新的集合&#xff0c;首先想到的肯定是遍历&#xff0c;如下&#xff1a; List<Long> u…

通过pymysql读取数据库中表格并保存到excel(实用篇)

本篇文章是通过pymysql将本地数据库中的指定表格保存到excel的操作。 这里我们假设本地已经安装了对应的数据库管理工具&#xff0c;里面有一个指定的表格&#xff0c;现在通过python程序&#xff0c;通过调用pymysql进行读取并保存到excel中。 关于数据库管理工具是Navicat P…

Android Studio学习7——常用控件view

Android控件 双击shift键——>搜索想要找的文件 Ctrlshift回车——>补全“&#xff1b;”号 CtrlX——>删除一行&#xff0c;只需把鼠标放在那一行 windows自带字体

LC 111.二叉树的最小深度

111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a; 叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a;…

mongodb的简单操作

文章目录 前言数据库的创建和删除集合的创建和删除文档的插入和查询异常处理更新数据局部修改符合条件的批量更新加操作 删除文档删除全部数据删除符合条件的数据 统计count统计有多少条数据统计特定条件有多少条数据 分页查询排序查询正则查询比较查询包含查询条件连接查询索引…

Docker 哲学 - push 本机镜像 到 dockerhub

注意事项&#xff1a; 1、 登录 docker 账号 docker login 2、docker images 查看本地镜像 3、注意的是 push镜像时 镜像的tag 需要与 dockerhub的用户名保持一致 eg&#xff1a;本地镜像 express:1 直接 docker push express:1 无法成功 原因docker不能识别 push到哪里 …

轻松上手 Tanssi:应用链开发与部署终极指南

随着 Polkadot 2.0 的推进&#xff0c;一个既强大又用户友好的技术支撑成为推动生态进步的关键&#xff0c;目的是为了降低应用链启动的成本和复杂度。在这个转折点上&#xff0c;Tanssi 逐渐成为应用链开发的首选解决方案。Tanssi 是一个旨在简化应用链部署流程的模块化基础设…

kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(二)

Pod调度策略 一.污点-Taint二.容忍度-Tolerations三.Pod常见状态和重启策略1.Pod常见状态2.Pod的重启策略2.1测试Always重启策略2.2测试Never重启策略2.3测试OnFailure重启策略&#xff08;生产环境中常用&#xff09; 一.污点-Taint 在 Kubernetes 中&#xff0c;污点&#x…

采用大语言模型进行查询重写——Query Rewriting via Large Language Models

文章&#xff1a;Query Rewriting via Large Language Models&#xff0c;https://arxiv.org/abs/2403.09060 摘要 查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展&#xff0c;因为它容易出错并且需要深厚的专业知识。 类似地…

codeforces Edu 142 D. Fixed Prefix Permutations 【思维、字典树求LCP】

D. Fixed Prefix Permutations 题意 给定 n n n 个长度为 m m m 的排列 a 1 , a 2 , . . . a n a_1,a_2,...a_n a1​,a2​,...an​ 定义一个排列 p p p 的 价值 为 最大顺序长度 k k k&#xff1a; p 1 1 , p 2 2 , p 3 3 , . . . p k k p_1 1,p_2 2, p_3 3, ...…

CLIP网络结构解析 openai/CLIP (Contrastive Language-Image Pre-Training)

1、简单介绍 CLIP是openai公司提出的网络&#xff0c;可以处理文本和图像&#xff0c;是一个多模态网络&#xff0c;对多模态的研究具有一定的推动作用。作为学习&#xff0c;记录一下对CLIP的理解。 clip的官方网站&#xff1a; https://openai.com/research/clip clip的GitH…

优于五大先进模型,浙江大学杜震洪团队提出 GNNWLR 模型:提升成矿预测准确性

卡塔尔世界杯自 2010 年荣膺举办权&#xff0c;直至 2022 年辉煌成功举办&#xff0c;累计投入资金高达约 2,290 亿美元。相较之下&#xff0c;此前七届世界杯的总花费仅约 400 多亿美元。这场体育盛事展现出奢华无度的风采&#xff0c;归根结底源于卡塔尔这个国度的深厚底蕴。…

nginx配置多vue项目

1. 找到linux docker安装好的nginx目录文件 进入nginx内 把打包好的vue项目放在html文件下 如上 三个文件夹下对应着三个不同的vue项目 2. 配置default.conf的配置文件&#xff0c; 一个nginx配置文件可以多个项目进行代理 进入到conf 找到conf.d下面的default.conf 文件…

SV学习笔记(二)

接口 什么是接口&#xff1f; 接口 主要用作验证 &#xff0c;国外有些团队会使用sv进行设计&#xff0c;那么接口就会用作设计。验证环境中&#xff0c;接口可以 使连接变得简洁而不易出错 。interface和module的使用性质很像&#xff0c; 可以定义端口&#xff0c;也可以定…

[C/C++] -- 二叉树

1.简介 二叉树是一种每个节点最多有两个子节点的树结构&#xff0c;通常包括&#xff1a;根节点、左子树、右子树。 满二叉树&#xff1a; 如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。深度为k&a…

如何备份极狐GitLab 信任域名证书

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何使用极狐GitLa…

WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具

关于WebCopilot WebCopilot是一款功能强大的子域名枚举和安全漏洞扫描工具&#xff0c;该工具能够枚举目标域名下的子域名&#xff0c;并使用不同的开源工具检测目标存在的安全漏洞。 工具运行机制 WebCopilot首先会使用assetsfinder、submaster、subfinder、accumt、finddom…

华为OD机试 - 最大社交距离(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

ubuntu20.04 运行 lio-sam 流程记录

ubuntu20.04 运行 lio-sam 一、安装和编译1.1、安装 ROS11.2、安装 gtsam1.3、安装依赖1.4、下载源码1.5、修改文件1.6、编译和运行 二、官方数据集的运行2.1、casual_walk_2.bag2.2、outdoor.bag、west.bag2.3、park.bag 三、一些比较好的参考链接 记录流程&#xff0c;方便自…