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();
        }


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这些策略助力打造多元化、公平和包容性招聘流程

多样性、公平和包容(DEI)是企业招聘员工的最佳策略。顾名思义&#xff0c;DEI描述了三个关键组成部分: “多元化”&#xff0c;这取决于吸引、招聘、雇佣和留住多元化的员工队伍; “公平”部分是指确保不歧视和平等就业机会; “包容”要求建立一个尊重、支持和包容的环境&am…

【学习】兼容性测试为何如此重要

兼容性测试是软件测试中非常重要的一环&#xff0c;旨在确保软件在不同的平台、浏览器、操作系统等环境下能够正常运行&#xff0c;并且不会出现兼容性问题。本文将介绍兼容性测试的概念、重要性、实施步骤及实践案例&#xff0c;帮助读者更好地理解兼容性测试在软件开发中的重…

【解决问题】排查linux手动删除文件,但是文件标记为deleted,资源未释放

背景&#xff1a; 生产环境我们把程序生成的数据文件手动删除后&#xff0c;但是空间并没有释放&#xff0c;导致硬盘被占用&#xff0c;不够用 问题排查&#xff1a; 1.查看占用文件状态 使用命令&#xff1a; lsof | grep deleted 查看 文件已经删除了&#xff0c;但是都是…

人事管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)请假加班招聘考勤

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

idea编译一直失败处理

切换分支的时候&#xff0c;明明代码正常&#xff0c;但是编译的时候一直失败。。。。特别是多个项目的时候&#xff0c;经常失败。 配置 -Djps.track.ap.dependenciesfalse idea默认是增量编译&#xff0c;设置这个false之后就从头开始编译了。 设置之后&#xff0c;点击编译&…

Linux系统中安装一些常用的插件备用

Linux系统中安装一些常用的插件备用 1.安装wget yum -y install wget 2.安装vim yum -y install vim-enhanced 3.更换yum源为国内的阿里云源&#xff08;选择&#xff09; 1、备份CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.…

划重点!实物黄金和现货黄金的区别

有人说虽然现货黄金不是实物黄金&#xff0c;但却胜于实物黄金&#xff0c;我们认为如果从投资的便利性&#xff0c;以及潜的获利空间这两个主要的方面来说&#xff0c;上述的观点是相当正确的。但投资者在正式参与之前&#xff0c;最好还是认真了解一下实物黄金和现货黄金的主…

建立统一网络身份认证平台,赋能用户信息安全

“近年来&#xff0c;层出不穷的网络谣言、网络暴力事件以及网络水军、网络黑灰产犯罪屡禁不止、屡打不绝&#xff0c;其主要原因是网络实名制落实不到位。”全国人大代表、黑龙江省大庆市公安局网络警察分局副局长贾晓亮接受记者采访时表示&#xff0c;网络信息安全问题是我们…

深度学习实战74-基于Transformer的ViT模型的搭建与实际应用,ViT模型的原理介绍

大家好,我是微学AI,今天给大家介绍一下深度学习实战74-基于Transformer的ViT模型的搭建与实际应用,ViT模型的原理介绍。Vision Transformer (ViT)是一种基于Transformer架构的深度学习模型,专门用于计算机视觉任务。与传统的卷积神经网络不同,ViT将输入图像分割成固定大小…

【C++】入门知识

1. 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称都将存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染&#xff0c;…

外汇110:交易中,是否真的存在确定性?

我们看问题的角度不同&#xff0c;得到的结果必然也是不一样的。我们不能否认任何一种可能性&#xff0c;但一切需要从逻辑出发。交易中&#xff0c;最大的确定性就是市场是不确定的&#xff0c;什么样的行情都可能发生。当然&#xff0c;绝对的确定性是不存在的&#xff0c;但…

制定合理的薪酬计划是激励员工的最佳方式

想要在竞争日益激烈的环境中取得成功的雇主必须有一个精心设计的薪酬计划&#xff0c;以激励员工&#xff0c;控制薪酬成本&#xff0c;并确保公平&#xff0c;最好的薪酬计划反映了雇主的文化&#xff0c;因此&#xff0c;雇主应该建立一种薪酬理念&#xff0c;福利项目也应该…

Mysql实战--为什么表数据删掉一半,表文件大小不变

经常会有同学来问我&#xff0c;我的数据库占用空间太大&#xff0c;我把一个最大的表删掉了一半的数据&#xff0c;怎么表文件的大小还是没变&#xff1f; 那么今天&#xff0c;我就和你聊聊数据库表的空间回收&#xff0c;看看如何解决这个问题。 这里&#xff0c;我们还是针…

Python字符串操作方法一览表

字符串操作 你患得患失太在意从前又太担心将来&#xff0c;有句话说的好昨天是段历史&#xff0c;明天是个谜团而今天是天赐的礼物 像珍惜礼物那样珍惜今天。—— 龟大仙《功夫熊猫3》 1.字符串连接 例子&#xff1a; str1 "Hello" str2 "World" resul…

stm32HAL库创建项目

stm32cubeMX 作用进行初始化芯片使编程者直接调用函数根据创作者的想法经行编写减少了查看芯片手册所消耗的时间 创建项目 打开软件 双击标记处选择mcu即芯片 在此处搜索芯片型号 在双击检索到的芯片 点击此处经行&#xff0c;文件位置&#xff0c;打开方式&#xff0c;项目…

天眼护航 安全无界:天通哨兵PS02—电力巡检保护的智能利器

在电力行业中&#xff0c;输电线路的安全稳定运行对于保障社会经济活动至关重要。然而&#xff0c;广阔的输电线路常常穿越复杂的地形和恶劣的自然环境&#xff0c;给电力巡检和保护工作带来了巨大挑战。 为了提高巡检效率和响应速度&#xff0c;更好地保障电力设施的安全运行…

谷歌google广告和必应Bing广告,是否二选一?

搜索引擎广告凭借其精准定向、高度可见性和高效转化能力&#xff0c;成为众多企业拓展海外市场、提升品牌影响力的重要手段。其中&#xff0c;谷歌Google与必应Bing作为全球两大主流搜索引擎&#xff0c;各自拥有庞大的用户群体与独特的市场优势。面对这两大广告平台&#xff0…

小问题/小技巧/小知识汇总(记录贴)

目录 第一章、小问题①使用了Lombok的Data注解&#xff0c;但是getter方法失效&#xff0c;报错空指针异常③什么是字典项查询④workbench 导出包错误&#xff1a;could not get mysql version⑤一个自定义导包后出现的小问题⑥使用org.json将xml转json的时候出错⑦报错MySQLSy…

一文秒解四大经典限流算法

阅读前提&#xff1a;没有最好的算法&#xff0c;只有最适合的算法&#xff01; 限流算法&#xff1a; 固定窗口限流算法 滑动窗口限流算法 漏桶限流算法 令牌桶限流算法 固定窗口限流算法 介绍 固定窗口限流算法&#xff08;Fixed Window Rate Limiting Algorithm&#…

乐校园二手书交易管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)大学生闲置二手书在线销售

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…