WPF自定义控件快速构成窗体布局

WPF UI开发教程自定义TabControl控件 我们发现自定义 WPF TabControl 的选项卡标题是多么容易,例如添加图像或为文本颜色。但是,如果您希望超越这一点并直接影响选项卡的外观,包括形状和边框,则需要覆盖 TabItem 元素的控件模板,虽然这不像 WPF 的大多数其他区域那样直接,但它是还是可控的。 因此,如果您想完全控制 TabControl 选项卡的外观。 这使得 TabControl 看起来有点像 Windows 8,没有边框和不太微妙的颜色来标记选定的选项卡,并且没有未选定选项卡的背景。所有这些都是通过使用 Style 阅读详情

http://blog.youkuaiyun.com/beilinu/article/details/8009968

之前做了一个类似于360界面的WPF程序,主要是通过对基本控件的模版来修改实现的,在其中定义了很多模版,后来由于源码丢失,导致在制作相同风格的程序时又得重头开始,所以尝试了下自定义控件的制作,制作一套构成界面的基本控件,方便以后调用。

控件下载地址

界面样式:

首先分析下界面构成:主要是由一个无边框窗体+TAB控件+若干个系统按钮构成,在wpf中,窗体控件的继承比较麻烦,加上无边框窗体样式设置比较简单,所以只需要制作一个TAB控件和系统按钮控件就可以了。按钮也只需一个就够了,样式都是一样的,只要更改下图片就行了。

好了,开始动手吧,首先是TAB控件

1.启动vs,创建名为“WMTabControl”的wpf自定义控件项目,并继承TabControl,vs为我们生成了2个文件:Generic.xaml,WMTabControl.cs其中Generic.xaml是用来定义控件样式模版的,WMTabControl.cs可以用来实现各种功能,比如新添加的属性之类的。

由于我们的WMTabControl不需要添加额外属性及功能,只是外观的改变,所以WMTabControl.cs就不用管他了,默认就行。

 接着在Generic.xaml里面定义控件样式模版

[html]  view plain copy
  1. <Grid>  
  2.     <DockPanel HorizontalAlignment="Stretch" Height="Auto" LastChildFill="True" Margin="0" Grid.Row="0" VerticalAlignment="Stretch" Width="Auto" Grid.RowSpan="1">  
  3.         <StackPanel x:Name="HeaderPanel" Height="Auto" VerticalAlignment="Top" Width="Auto" DockPanel.Dock="Top" IsItemsHost="True" Orientation="Horizontal" CanHorizontallyScroll="True"/>  
  4.         <Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Width="Auto" DockPanel.Dock="Bottom" Margin="0" Background="{TemplateBinding Background}">  
  5.             <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Height="Auto"/>  
  6.         </Border>  
  7.     </DockPanel>  
  8. </Grid>  

然后继续新建项目WMTabItem

添加模版

[html]  view plain copy
  1. <Setter Property="Template">  
  2.             <Setter.Value>  
  3.                 <ControlTemplate TargetType="{x:Type local:WMTabItem}">  
  4.                     <Grid x:Name="templateRoot" SnapsToDevicePixels="True" Width="74" Height="82">  
  5.                         <VisualStateManager.VisualStateGroups>  
  6.                             <VisualStateGroup x:Name="CommonStates"/>  
  7.                             <VisualStateGroup x:Name="SelectionStates"/>  
  8.                             <VisualStateGroup x:Name="FocusStates"/>  
  9.                             <VisualStateGroup x:Name="ValidationStates"/>  
  10.                         </VisualStateManager.VisualStateGroups>  
  11.                         <Grid.RowDefinitions>  
  12.                             <RowDefinition Height="62"/>  
  13.                             <RowDefinition Height="20"/>  
  14.                         </Grid.RowDefinitions>  
  15.                         <Border x:Name="mainBorder" BorderThickness="1,1,1,0" Margin="0" Grid.RowSpan="1" Background="{TemplateBinding Background}" Width="48" Height="48" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5"/>  
  16.                         <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" Focusable="False" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Top" TextElement.Foreground="{TemplateBinding Foreground}"/>  
  17.                     </Grid>  
  18.                     <ControlTemplate.Triggers>  
  19.                         <Trigger Property="Selector.IsSelected" Value="True">  
  20.                             <Setter Property="Background" TargetName="templateRoot">  
  21.                                 <Setter.Value>  
  22.                                     <ImageBrush Stretch="Uniform" ImageSource="/WMControl;component/image/toolbar_pushed.png"/>  
  23.                                 </Setter.Value>  
  24.                             </Setter>  
  25.                         </Trigger>  
  26.                         <MultiTrigger>  
  27.                             <MultiTrigger.Conditions>  
  28.                                 <Condition Property="IsMouseOver" Value="True"/>  
  29.                                 <Condition Property="Selector.IsSelected" Value="False"/>  
  30.                             </MultiTrigger.Conditions>  
  31.                             <Setter Property="Background" TargetName="templateRoot">  
  32.                                 <Setter.Value>  
  33.                                     <ImageBrush ImageSource="/WMControl;component/image/toolbar_hover.png"/>  
  34.                                 </Setter.Value>  
  35.                             </Setter>  
  36.                             <Setter Property="RenderTransform" TargetName="mainBorder">  
  37.                                 <Setter.Value>  
  38.                                     <TransformGroup>  
  39.                                         <ScaleTransform ScaleX="1.05" ScaleY="1.05"/>  
  40.                                         <SkewTransform/>  
  41.                                         <RotateTransform/>  
  42.                                         <TranslateTransform/>  
  43.                                     </TransformGroup>  
  44.                                 </Setter.Value>  
  45.                             </Setter>  
  46.                         </MultiTrigger>  
  47.                     </ControlTemplate.Triggers>  
  48.                 </ControlTemplate>  
  49.             </Setter.Value>  

好了,一个控件搞定了,下面开始制作按钮控件,老样子,添加新项目WMButton。
按钮有三个状态,默认,按下,鼠标划过,在这里主要是通过触发器改变背景色实现。

另外还要新添加两个属性,分别用来存放 鼠标按下,鼠标划过的图片。

[csharp]  view plain copy
  1. public ImageSource MoverBrush  
  2. {  
  3.     get { return base.GetValue(MoverBrushProperty) as ImageSource; }  
  4.     set { base.SetValue(MoverBrushProperty, value); }  
  5. }  
  6. public static readonly DependencyProperty MoverBrushProperty = DependencyProperty.Register("MoverBrush", typeof(ImageSource), typeof(WMButton));  
  7.   
  8. public ImageSource EnterBrush  
  9. {  
  10.     get { return base.GetValue(EnterBrushProperty) as ImageSource; }  
  11.     set { base.SetValue(EnterBrushProperty, value); }  
  12. }  
  13. public static readonly DependencyProperty EnterBrushProperty = DependencyProperty.Register("EnterBrush", typeof(ImageSource), typeof(WMButton));  

接着在模版里面定义两个笔刷,并绑定到上面两个属性

[html]  view plain copy
  1. <ImageBrush x:Key="EnterBrush" ImageSource="{Binding EnterBrush, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:WMButton}}}" Stretch="None"></ImageBrush>  
  2. <ImageBrush x:Key="MoverBrush" ImageSource="{Binding MoverBrush, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:WMButton}}}" Stretch="None"></ImageBrush>  
然后在按钮状态触发器里面分别使用上面两个笔刷就可以了

[html]  view plain copy
  1. <ControlTemplate.Triggers>  
  2.     <Trigger Property="IsMouseOver" Value="True">  
  3.         <Setter Property="Background" TargetName="border" Value="{StaticResource MoverBrush}"/>  
  4.     </Trigger>  
  5.     <Trigger Property="IsPressed" Value="True">  
  6.         <Setter Property="Background" TargetName="border" Value="{StaticResource EnterBrush}"/>  
  7.     </Trigger>  
  8. </ControlTemplate.Triggers>  

到此为止,两个控件就搞定了。下面开始试试看,

1.重新建立WPF项目,并制作一个无边框窗体



2.引用刚才制作的控件,把TAB控件放在窗体上,并删除自带的TabItem(因为我们有自定义的TabItem,不用他的),在tab控件根目录下添加刚才制作的WMTabItem。



好难看。。。。。不过不要着急,给他换个图片先




额,效果还不错,好了,多复制几个,再把刚才制作的按钮也放上,再添加三张图片,默认状态的图片就直接改变背景笔刷就行了,另外两个状态就要用到刚才添加的两个新属性了,在属性面板找到刚才添加的新属性,分别添加两张图片。




还行,继续拖控件,关闭,最大化,最小化,图片自己找就行了




好了,一个基本的界面就搭建好了,可以加上标题之类的,位置也可以根据需要调整下。很方便,只需要将刚才制作的两个控件拖进来,改变下图片,一个简单的界面布局就完成了。




添加换肤功能:

主要是绑定窗体背景,具体就不多说了,看代码

wpf下拉框控件_HandyControl:重写原生样式,包含 70余款自定义控件的WPF控件库 Gitee 此前为大家介绍过一款优质的 WPF 控件库,受到了很多 C# 开发者的欢迎,由此可见Windows 开发者的基数仍然很高。今天为大家推荐的就是另一款在 Gitee 上很受欢迎的 WPF 控件库。项目名称:HandyControl项目作者:HandyOrg开源许可协议:MIT项目地址:https://gitee.com/handyorg/HandyControl项目简介HandyCont... 阅读详情

相关推荐

WPF桌面应用开发,基础入门,以及和C#相互结合开发桌面移动端

WPF(Windows Presentation Foundation)是微软.NET框架的一部分,它为开发人员提供了一套丰富的图形、用户界面和多媒体处理功能。在C#中,WPF可用于创建传统的桌面应用程序,这些应用程序具有丰富的视觉效果和用户交互。通过使用C#和WPF,你可以创建出外观漂亮、性能卓越的桌面应用程序。WPF引入了许多新的概念和技术,使得开发人员能够更加高效地构建应用程序。

2202_75310477的博客 2570

WPF 自定义TabControl

整体实现思路首先自定义UTabControl、然后自定义TabItem。1、UTabControl.cs 代码。2、UTabControl模板资源样式。4、UTabItem 模板资源样式。3、UTabItem 代码。

hisxiwu的博客 1813

使用 WPF 的 DataGrid 控件进行数据展示和编辑是相当常见的任务

在示例代码中,我们在窗口的构造函数中创建了一个包含几个 Person 对象的 ObservableCollection。然后,我们将该集合设置为 DataGrid 的 ItemsSource,从而将数据绑定到 DataGrid。在实际应用中,我们可以根据需要自定义列样式、添加按钮或其他控件,并处理数据的增删改操作。现在,当我们运行应用程序时,DataGrid 将显示我们定义的列和数据。我们可以在 DataGrid 中编辑数据,并自动反映到我们的数据集合中。接下来,我们需要定义 DataGrid 的列。

XsfFsharp的博客 669

TabItem中动态添加多个控件

1.通过代码形式, 先加入Panel, 然后依次加入你要的控件。 StackPanel panel = new StackPanel(); Button button=new Button(){Content="button1"}; TextBlock textblock= new TextBlock(){Text="TextBlock1"}; p...

crkres9527 4975

WPF上位机框架实战:创建滑动抽屉窗体

WPF(Windows Presentation Foundation)是.NET Framework的一部分,它提供了一种新的方式来创建Windows客户端应用程序。通过WPF,开发者可以使用XAML(可扩展应用程序标记语言)来定义用户界面,并用C#或VB.NET编写逻辑代码。WPF的突出优势在于它的矢量图形渲染引擎、数据绑定、样式和模板功能,这些特性共同支撑起一个可扩展、可交互和高度可定制的用户界面框架。

weixin_42153793的博客 1358

实现Winform与WPF窗体间交互的全面指南

在.NET框架的发展历程中,Windows窗体(Winform)和Windows Presentation Foundation(WPF)是构建桌面应用程序的两大核心技术。虽然它们都可以用来创建Windows桌面应用程序,但它们之间存在显著的差异。在本章节中,我们探讨了WPF应用性能优化的多个关键领域。通过优化XAML代码、数据绑定以及减少资源加载时间和内存使用,我们可以显著提升WPF应用的性能。此外,合理的窗口大小和显示设置也是确保应用流畅运行的重要因素。

weixin_35835018的博客 2173

WPF快速入门系列(1)——WPF布局概览

一、引言  关于WPF早在一年前就已经看过《深入浅出WPF》这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF...

zls365365的博客 513

掌握WPF中的DockPanel布局技巧

DragDrop类在WPF中扮演着至关重要的角色,它提供了一组API来处理拖放操作。利用DragDrop类,开发者可以定义拖动的源(DragSource)和放置的目标(DropTarget)。这种方法的好处在于,开发者无需从头开始编写拖放逻辑,而是可以利用现有的框架,快速实现拖放功能,同时保证了功能的稳定性和跨平台的兼容性。DragDrop类的一大优势是易于使用,并且高度可定制。开发者可以定制拖动开始时的视觉反馈、拖动过程中以及放下时的操作逻辑。

weixin_28721743的博客 1047

c# wpf listbox 高度_WPF快速入门系列(1)——WPF布局概览

一、引言  关于WPF早在一年前就已经看过《深入浅出WPF》这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中主要的几个不同的特性,如依赖属性、命令、路由事件等。  在正式介绍之前,我还想分享下为什么我又要重新捡起来WPF呢?之前没有记录下来的原来主要是打算走互联网方向的,后面发现互联网方向经常加班,又累,有...

weixin_39928993的博客 943

WPF自定义VirtualizingPanel,实现界面动态布局

通过自定义扩展VirtualizingPanel,结合ListBox控件,实现了界面布局的灵活配置,支持1*2,1*3,2*2等任何布局方式,并且支持滚动条

Python使用netmiko配置华为交换机

1.netmiko就是专门为网络设备做的模块,非常强大。1.更适合网络设备的自动化运维模块。2、批量配置变更、备份。1.安装netmiko。2. 创建SSH连接。一、netmiko介绍。

博然的宝藏库 2795

WPF-前端之对多个控件实现同一操作地共同实现

给大家推荐一篇关于WPF前端界面取颜色的博客:https://code.ziqiangxuetang.com/try/color.py?hex=F5F5F5/ 还有小谷告诉我的,如何快速地让同一类型的控件得到同样地更改,即同样地遍历 举个例子如下: 在敲前端时,我想要实现让同一窗体里边的不同布局(Grid)里所有的label控件的字体颜色都做同样地改变,字体颜色都从白色变成黑色 代码如下 ...

dsl 1584

Carsim和Matlab/Simulink联合仿真时Carsim匹配不到Matlab的解决方法

      本人使用Carsim和Matlab/Simulink联合仿真做过用机器学习方法解决ACC和简单换道的仿真,曾将8.02 2016 2018三个版本Carsim反复安装N次,有相同方向的同学或安装过程遇到问题的同学可以加本人qq505625869一起交流经验心得。 一.前言       Carsim是一款很好的联合仿真软件,使用Carsim,可以避免搭建很多非常复杂的动力学模型

Kaikai_Liao的博客 8767

第一章:初识WPF,XAML,WPF控件

初识WPF,XAML,WPF体系架构,控件分类

鲤籽鲲的博客 3854

Ai数字人直播系统源码部署

虚拟形象定制,直播内容智能生成,多语言支持,智能互动,声音克隆,24 小时不间断直播,多平台直播,智能数据分析,实时情感识别,视频合成,Ai数字人直播系统源码出售,Ai数字人直播系统源码部署实现 AI 数字人 24 小时不间断直播功能是一个较为复杂的任务,涉及到多个方面,如直播流的推送、内容的持续生成、系统的稳定性保障等。以下为你提供一个简化的实现思路和示例代码,借助 Python 结合 FFmpeg 工具来模拟 24 小时不间断直播。

weixin_ggwwsscc的博客 1256

STM32硬件SPI驱动W5500以太网模块全流程(附避坑指南)

本文详细介绍了如何使用STM32硬件SPI驱动W5500以太网模块,包括开发环境准备、SPI接口配置、网络参数设置及常见问题排查。通过官方驱动移植和实战案例,帮助开发者快速实现以太网通信功能,适用于智能家居、工业控制等物联网应用场景。

weixin_29192141的博客 364

WPF快速入门系列(一)--WPF布局概览

一.WPF的自我介绍 Windows Presentation Foudation,WPF是下一代显示系统,用来生成能带给用户震撼视觉体验的Windows客户端应用程序。WPF的核心是一个与分辨率无关并且基于向量的程序引擎,目的在于利用现代图形硬件的优势。WPF在.NET Framework 3.0中被微软引入到.NET Framework类库中,并且在.NET 3.5、4.0 和...

qq_40098572的博客 548

Open3d (C++) RANSAC拟合圆柱(详细过程版)

实现了一种基于RANSAC算法的圆柱拟合方法。

点云侠的博客 239

WPF制作无边框窗体、圆角窗体、支持改变大小、拖动分屏等(一)

目录概述需求说明无边框窗体 概述 Windows Presentation Foundation (WPF) 是一个可创建桌面客户端应用程序的 UI 框架。 WPF 开发平台支持广泛的应用开发功能,包括应用模型、资源、控件、图形、布局、数据绑定、文档和安全性。 此框架是 .NET Framework 的一部分,因此,在未来如果想快速的开发桌面软件,WPF腚是你的不二选择。 需求说明 WPF既然是桌面软件UI,那一定绕不开桌面软件的多元化(chan pin jing li de chou pi)显示方式,最常

若汝棋茗 的博客 4819

化工热力学软件:Aspen Plus二次开发_(9).过程控制与动态模拟v1

Aspen Plus 提供了丰富的过程控制工具和方法,可以用于静态和动态过程的模拟和控制策略的开发。通过控制回路设计、动态模拟、优化工具和数据交换接口,用户可以设计和优化各种复杂的控制策略,提高化工生产的稳定性和效率。此外,结合外部软件(如MATLAB、Simulink、LabVIEW等),可以实现更高级的控制策略,如自适应控制和模型预测控制,进一步提升过程控制的精度和灵活性。希望本文的内容能帮助用户更好地理解和应用Aspen Plus中的过程控制功能。

kkchenjj的博客 405

Python爬虫教程:抓取Android或iOS应用中的数据

随着智能手机的普及,移动应用程序已经成为我们生活中不可或缺的一部分。从社交媒体、在线购物到金融服务和健康管理,几乎所有领域都有相应的手机应用程序(App)服务用户。而这些应用程序通常会存储大量的数据,例如用户行为、产品信息、订单记录等。如果我们能有效地抓取这些数据,可以为数据分析、商业智能、用户行为分析等提供有力支持。本文将重点介绍如何使用Python爬虫技术抓取Android或iOS应用中的数据,尤其是如何从这些应用的后端接口、存储、或网页中提取数据。我们将探讨如何通过反向工程技术访问移动应用中的API接

2201_76125261的博客 801

【免费下载】 WPF控件大小自适应窗体变化:让界面设计更灵活

在软件开发领域,用户界面的设计始终是提升用户体验的关键一环。本文将为您介绍一款开源项目——WPF控件大小自适应窗体变化,它能够帮助开发者轻松实现控件与窗体尺寸的无缝配合,让界面设计更加灵活。 ## 项目介绍 WPF控件大小自适应窗体变化项目,提供了一套详细的教程和资源文件,旨在帮助开发者在WPF应用程序中实现控件尺寸的自适应调整。这一功能对于提升应用程序的用户体验至关重要,尤其是在窗体缩放或调...

gitblog_06706的博客 430

ESP32-C3入门教程 环境篇③——VS Code IDE快速入门

文章目录一、安装Visual Studio Code二、安装扩展三、配置ESP-IDF 插件四、创建工程五、配置工程5.1 选择目标芯片5.2 项目配置六、编译工程七、固件分析七、固件下载八、串口日志九、单步调试 一、安装Visual Studio Code 下载并安装Visual Studio Code 二、安装扩展 左侧扩展 搜索espressif 点击安装 三、配置ESP-IDF 插件 按下F1按键 输入configure esp-idf extension EXPRESS,如果你

8304
上一篇: [WPF] 如何为无边框窗口设置阴影效果
下一篇: 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒
fighter_yy
博客等级 码龄20年 22粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值