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.hqwc.cn/news/588743.html

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

相关文章

Harmony创建Page省事小技巧

在创建Page页面时&#xff0c;选择ArkTS File时&#xff0c;创建的文件不会自动生成基础代码&#xff0c;也不会自动在main_page.json中自动进行注册&#xff0c;如何解决问题呢&#xff0c;其实很简单创建Page页面时选择Page项后就会创建Page文件&#xff0c;创建完的页面会自…

【C语言】2048小游戏【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏描述&#xff1a; 2048是一款数字益智类游戏&#xff0c;玩家需要使用键盘控制数字方块的移动&#xff0c;合并相同数字的方块&#xff0c;最终达到数字方块上出现“2048”的目标。 每次移动操作&#xff0c;所…

掌握这些技巧:Flutter应用顺利登陆App Store的秘诀

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

Python快速入门系列-8(Python数据分析与可视化)

第八章:Python数据分析与可视化 8.1 数据处理与清洗8.1.1 数据加载与查看8.1.2 数据清洗与处理8.1.3 数据转换与整理8.2 数据可视化工具介绍8.2.1 Matplotlib8.2.2 Seaborn8.2.3 Plotly8.3 数据挖掘与机器学习简介8.3.1 Scikit-learn8.3.2 TensorFlow总结在本章中,我们将探讨…

了解这些技术:Flutter应用顺利登陆iOS平台的步骤与方法

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

Flash存储芯片:NOR Flash、NAND Flash、UFS和eMMC的比较与解析

前言 在数字化时代的今天&#xff0c;数据的存储和管理变得越来越重要。各种各样的存储技术应运而生&#xff0c;以满足不同的使用场景和需求。其中&#xff0c;Flash存储芯片以其非易失性、可擦写性和可编程性等优势&#xff0c;占据了重要地位。本博客将详细介绍Flash存储芯片…

在线点餐(源码+文档)

在线点餐系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端主页登录点餐注册个人资料我的 后台管理商品管理分类管理用户管理登录页订单管理分类管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、参考…

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, ...…

【威胁情报综述阅读3】Cyber Threat Intelligence Mining for Proactive Cybersecurity Defense

【威胁情报综述阅读1】Cyber Threat Intelligence Mining for Proactive Cybersecurity Defense: A Survey and New Perspectives 写在最前面一、介绍二、网络威胁情报挖掘方法和分类A. 研究方法1&#xff09; 第 1 步 - 网络场景分析&#xff1a;2&#xff09; 第 2 步 - 数据…

MySQL 8.0.13安装配置教程

写个博客记录一下&#xff0c;省得下次换设备换系统还要到处翻教程&#xff0c;直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件&#xff0c;并用编辑器写入如下数据 [mysqld] [client] port…

使用 Docker 部署 Puter 云桌面系统

1&#xff09;Puter 介绍 :::info GitHub&#xff1a;https://github.com/HeyPuter/puter ::: Puter 是一个先进的开源桌面环境&#xff0c;运行在浏览器中&#xff0c;旨在具备丰富的功能、异常快速和高度可扩展性。它可以用于构建远程桌面环境&#xff0c;也可以作为云存储服…

“由于找不到opencv_world3413.dll,无法继续执行代码”的解决方法

问题 在Windows系统中&#xff0c;编译完涉及到opencv的项目后&#xff0c;提示&#xff0c; 由于找不到opencv_world3413.dll&#xff0c;无法继续执行代码 解决方法 在编译好的opencv的bin文件内&#xff08;如&#xff1a;D:\code\vs2017\opencv\build\x64\vc15\bin&…