WPF 模板与样式

我们在工作中经常需要更改控件的样式,因为自带的控件确实不太好看。不过我觉得应该有很多和我一样的新手菜鸟在想自己绘制控件的时候一头雾水,无从下手,在网上找到合适的模板也只是复制粘贴,实际怎么写的根本看不懂,非常头大。我在B站看到一篇非常不错的教程叫做《WPF故事模式》,其中的模板与样式章节看完后感觉有些许启发。在此我将讲义写在这里,还有一些我的个人实践,大家可以参考。

一、Window.Resources

1、资源与声明的使用

每个WPF的界面元素都具有Resources属性,这个属性的类型为ResourceDictionary类型,其能够以键值对的形势存储资源,当我们需要某个资源时,使用键值对可以索引到资源对象。我们可以在任何元素上去定义资源,可通过x:Key指令来分配唯一

2、静态资源与动态资源

静态资源使用(StaticResource)指的是在程序载入内存是,对资源的一次性使用,之后就不再去访问这个资源了;

动态资源使用(DynamicResource)指的是程序运行过程中,仍然会去访问该资源。

资源管理形式

在WPF项目中,我们一般有以下几种方法来管理Window.Resources:

  • 直接在窗口对应的xaml中定义资源,这样可以方便的在主窗口使用资源,但是如果资源很多或者需要在其他窗口或用户控件中使用就不太合适。

  • 在App.xaml中定义资源,这样可以让资源在整个应用程序的范围内共享,实现一致的主题和外观,但是如果资源很多或者需要根据不同的窗口或用户控件进行区分,就不太合适。

  • 创建文件夹并创建内容元素ResourceDictionary的xaml页面,这样可以将资源分组和模块化,方便管理和维护,也可以根据需要在不同的窗口或用户控件中引用或合并资源。

二、ControlTemplate

控件模板

WPF的ControlTemplate是一种用于定义和自定义控件的外观和结构的模板,她可以完全替换控件的默认模板,实现个性化和复杂的效果。WPF的ControlTemplate有以下几个特点:

  • ControlTemplate是一个XAML元素,它可以包含任何类型的UI元素,如布局、形状、图像、文本等,这些元素构成了控件的视觉树(VisualTree)。

  • ControlTemplate可以使用TemplateBinding或Binding来绑定控件的属性或数据,从而实现动态的显示和更新。

  • ControlTemplate可以使用Triggers来定义控件对不同的条件或事件的响应,如改变属性,播放动画,执行操作等。

  • ControlTemplate可以使用ContentPresenter或者ItemsPresenter来呈现控件的内容或子元素,从而保留控件的基本功能。

  • ControlTemplate可以在Style或ResourceDictionary中定义,并应用到一个或多个控件上,从而实现资源的重用和管理。

    想要绘制一个控件要先知道要绘制的控件原本是如何编写的,选中原控件右键点击编辑模板,编辑副本就可以看到原来控件是怎么编写的。

三、Trigger(触发器)

WPF的Trigger是一种用于定义和管理XAML资源的触发器,他可以根据不同的条件或事件来改变控件的属性或行为。以下是触发器的类型:

  • Tigger(基本触发器):这种触发器是根据控件自身的依赖属性的值来触发的,例如,当鼠标移动到按钮上时,改变按钮的背景色。

  • DataTrigger(数据触发器):这种触发器是根据绑定的数据的值来触发的,例如,当绑定的数据为真时,显示一个图标。

  • EventTrigger(事件触发器):这种触发器是根据控件的路由事件来触发的,例如,当按钮被点击时,播放一个动画。

  • MultiTrigger、MultiDataTrigger(多条件触发器):这种触发器是根据多个条件的组合来触发的,例如,当控件的属性和绑定的数据同时满足某些值时,改变控件的样式。

在视频中用的是按钮举例,这里也用按钮举例,右键编辑副本

我们可以看到Button是怎么写的,由一个border和ContentPresenter还有很多属性和事件共同组成,看懂了这些我们就可以着手在这个按钮上的样式进行修改了,最常用的还是当属圆角按钮,我们只需要给Border加一条属性CornerRadius 设置这个属性的值就有一个圆角按钮了

这些也只是我的一些个人理解,相当于是我的学习笔记,这些都是基础中的基础,不过将这些基础掌握,融会贯通的话就能举一反三做出原来越漂亮的控件吧。希望对大家有帮助吧。

对了UP南邸鬼王_Learn的关于WPF的教学视频非常不错,比较适合有一点基础,但是又一知半解的同志,可以学习一下。

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF Prism是一种用于构建可扩展且可维护的模块化WPF应用程序的框架。在WPF Prism中,模块是应用程序的功能单元,可以根据需要进行加载和卸载。 下面是一个简单的WPF Prism模块动态加载的示例: 1. 创建一个名为ModuleA的WPF Prism模块项目。 2. 在ModuleA项目的App.xaml.cs文件中,添加以下代码: ``` protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 注册ModuleA的服务 } protected override void OnInitialized() { // 初始化ModuleA } public void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModule(new ModuleInfo() { ModuleName = "ModuleA", ModuleType = typeof(ModuleAModule).AssemblyQualifiedName, InitializationMode = InitializationMode.WhenAvailable }); } ``` 3. 创建一个名为ModuleB的WPF Prism模块项目。 4. 在ModuleB项目的App.xaml.cs文件中,添加以下代码: ``` protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 注册ModuleB的服务 } protected override void OnInitialized() { // 初始化ModuleB } public void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModule(new ModuleInfo() { ModuleName = "ModuleB", ModuleType = typeof(ModuleBModule).AssemblyQualifiedName, InitializationMode = InitializationMode.WhenAvailable }); } ``` 5. 在Shell项目的App.xaml.cs文件中,添加以下代码: ``` protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 注册Shell的服务 } protected override Window CreateShell() { // 创建Shell窗口 } protected override void InitializeModules() { base.InitializeModules(); // 加载ModuleA和ModuleB模块 var moduleCatalog = (ModuleCatalog)ModuleCatalog; moduleCatalog.AddModule(typeof(ModuleAModule)); moduleCatalog.AddModule(typeof(ModuleBModule)); } ``` 通过以上的步骤,我们实现了ModuleA和ModuleB模块的动态加载。在应用程序启动时,Shell项目会加载ModuleA和ModuleB模块,并根据需要进行初始化和注销。 这样,我们就可以使用WPF Prism实现模块化的应用程序,并根据需求动态加载模块,提高应用程序的可扩展性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值