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

news2024/11/26 3:46:06

目录

一、基础

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.coloradmin.cn/o/1565485.html

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

相关文章

【LeetCode热题100】79. 单词搜索(回溯)

一.题目要求 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

揭秘代码安全:告别硬编码,灵活策略守护你的账户密码信息安全

前言 在编写代码时&#xff0c;为了遵循严格的安全规范&#xff0c;应避免硬编码任何敏感信息如账号凭证、密钥等直接出现在源代码中。相反&#xff0c;推荐采取安全措施&#xff0c;如使用环境变量、加密存储或安全凭据管理系统来间接引用和保护这类数据。如此一来&#xff0c…

使用 Docker 部署 Puter 云桌面系统

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

c++对象指针

对象指针在使用之前必须先进行初始化。可以让它指向一个已定义的对象&#xff0c;也可以用new运算符动态建立堆对象。 定义对象指针的格式为&#xff1a; 类名 *对象指针 &对象; //或者 类名 *对象指针 new 类名(参数); 用对象指针访问对象数据成员的格式为&#xff1a…

python很坐标报错ufunc ‘isfinite‘ not supported for the input types

python使用plt画图的时候&#xff0c;出错。 出错全文如下&#xff1a; Traceback (most recent call last): plt.show() return _get_backend_mod().show(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ __call__ manager.show(**kwar…

Node.js环境调用百度智能云(百度云)api鉴权认证三步走

方式一 :Postman脚本的方式生成v1版本的认证字符串 Postman脚本下载 下载Postman pre-request Script 设置 Authorization 示例脚本 方式二&#xff1a;在线签名工具生成 (试用于验证编程字符串签名是否有错误) 签名计算工具 https://cloud.baidu.com/signature/index.html …

深入核心招聘场景,用友大易帮助健合集团解决「渠道、效率、体验」三件事

自1999年成立以来&#xff0c;健合集团一直致力于婴幼儿营养与护理、成人自然健康营养与护理、以及宠物营养与护理三大核心领域。作为全球高端家庭营养及护理品牌的佼佼者&#xff0c;健合集团始终秉持「让人们更健康更快乐」的企业理念&#xff0c;这不仅体现在产品和服务上&a…

腾讯云(CVM)托管进行权限维持

前言 刚好看到一个师傅分享了一个阿里云ECS实战攻防&#xff0c;然后想到了同样利用腾讯云CVM的托管亦可实现在实战攻防中的权限维持。 简介 腾讯云自动化助手&#xff08;TencentCloud Automation Tools&#xff0c;TAT&#xff09;是一个原生运维部署工具&#xff0c;它可…

苹果放弃造车计划,专家称之All in AI / 阿里巴巴主席蔡崇信:中国电子商务渗透率有望超过40% |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 苹果放弃造车计划&#xff0c;专家称之All in AI 阿里巴巴主席蔡崇信&#…

JDK、JRE和JDK的关系

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

【Python项目】AI动物识别工具

目录 背景 技术简介 系统简介 界面预览 背景 成像技术在全球科技发展中扮演了关键角色。在科学研究领域&#xff0c;拍摄所得的图像成为了一种不可或缺的研究工具。特别是在生态学与动物学研究中&#xff0c;鉴于地球的广阔地域和多样的气候条件&#xff0c;利用图像技术捕…

生物信息学数据库分类

生物信息学数据库 &#xff08;一&#xff09;文献数据库 1、PubMed&#xff1a;拥有超过两百六十万生物医学文献的数据库&#xff0c;这些文献来源于MEDLINE&#xff0c;也就是生物医学文献数据库、生命科学领域学术杂志、以及在线的专业书籍。链接&#xff1a;PubMed (nih.g…

【原创】基于springboot+vue疫苗预约管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

亚马逊卧式婴儿车和坐式婴儿车需要那些认证?欧盟美国加拿大要求那些检测标准

卧式婴儿车和坐式婴儿车上亚马逊需要那些认证&#xff1f;欧盟美国加拿大要求那些检测标准&#xff1f; 很荣幸您能看到我的资讯&#xff0c;亚马逊各国认证是我公司的优势产品&#xff0c;确保申诉成功并正常销售。服务周到&#xff0c;速度快&#xff0c;周期短。 欧盟 卧…

蓝色wordpress外贸建站模板

蓝色wordpress外贸建站模板 https://www.mymoban.com/wordpress/7.html

【2024 信息素养大赛c++模拟题】算法创意实践挑战赛(基于 C++)

一、 比赛简介 国务院发布《国务院关于印发新一代人工智能发展规划的通 知》&#xff0c;明确实施全民智能教育项目。教育部印发《2019 年教育信息 化和网络安全工作要点》&#xff0c;推动在中小学阶段设置人工智能相关课 程&#xff0c;逐步推广编程教育。本赛项是在贯彻…

“视频号小店”会被“抖音小店”取代,成为下一个电商风口吗?

大家好&#xff0c;我是电商花花。 随着越来越多的人来视频号上开店卖货&#xff0c;做直播带货&#xff0c;让视频号小店逐渐成为下一个红利平台。 最近&#xff0c;很多人都说视频号小店可能会取代抖音小店&#xff0c;成为下一个电商风口&#xff0c;那么视频号小店真的能…

Java | Leetcode Java题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; class Solution {public int reverse(int x) {int rev 0;while (x ! 0) {if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {return 0;}int digit x % 10;x / 10;rev rev * 10 digit;}return rev;} }

事件循环(2024 面试题)

答题大纲 先说基本知识点&#xff0c;宏任务、微任务有哪些说事件循环机制过程&#xff0c;边说边画图出来说async/await执行顺序注意&#xff0c;可以把 chrome 的优化&#xff0c;做法其实是违法了规范的&#xff0c;V8 团队的PR这些自信点说出来&#xff0c;显得你很好学&a…

Mybatis plue(二) 核心功能

核心功能 P5 条件构造器 mybatisplus支持各种复杂的where条件&#xff0c;可以满足日常开发的所有需求 wrapper就是条件构造器,wrapper就是顶层的&#xff0c; 示例&#xff1a; 查询出名字带0&#xff0c;存款大于等于1000的人的id,username,info,balance字段 Testvoid te…