WinUI3-自定义应用背景

news/2024/11/17 22:20:38/

原文链接

https://white-night.club/index.php/2023/05/22/appdev5/

2023年5月22日

将应用背景设置为自定义的图片

前言

图片和应用界面色调的选择

这一块仁者见仁,智者见智。但最好从用户交互的角度去仔细思考颜色的搭配。设想一下,你的用户打开你的应用,发现蓝色背景红色字,标题栏还是绿色。我要是用户我就得高血压。

如果你选择深色的背景,那么应用主题、导航栏颜色、标题栏颜色最好选择偏白色的,反之亦然。我个人的其中一个颜色搭配如下:

  • 二次元背景,大部分背景色为黑色。
  • 应用标题栏选择#ffffffff。
  • 导航栏背景色选择#ceffffff。
  • 页面框架颜色选择#00000000。
  • 应用的主题设置为light。

实现效果如图,主要是这么搭配,你自定义的标题栏几乎能和导航栏融为一体。我个人觉得还是能凑合看的。

还有就是图片要素不要选太杂的。特别是当你想把页面框架的背景设置图中这种半透明的效果时。我自己试过了,图片选那种要素太多的会导致用户看不清你的界面。

全局背景设置

MainWindow.xaml

显然,你想让用户从打开应用到关闭应用,都能加载出自定义的背景。那么肯定是在你的窗口文件MainWindow.xaml中操作。

我直接把代码放上来。这段代码中包括:

  • 自定义的图片,及其存放的相对路径
  • 导航栏
  • 页面框架

别忘了修改图片存放的路径,已经在代码中高亮标记了。

//MainWindow.xaml
<Grid><Grid.Background><ImageBrush x:Name="ApplicationBackgroundImage" ImageSource="Assets/Background/Default.jpg" Stretch="UniformToFill"/></Grid.Background><Grid Background="#ffffffff" x:Name="AppTitleBar" Grid.Column="0" VerticalAlignment="Top"><TextBlock x:Name="AppTitleTextBlock"TextWrapping="NoWrap" Text="LoginMenuTemplate"FontStretch="Expanded"VerticalAlignment="Center"Margin="10,10,1,2"/></Grid><Grid Margin="0,29.5,0,0"><NavigationView  x:Name="navigationView" Background="#ceffffff" SelectionChanged="LoadPages" IsBackButtonVisible="Collapsed" IsSettingsVisible="False"  ><NavigationView.MenuItems><NavigationViewItem Icon="Home" Content="主页" Tag="Home"/>      </NavigationView.MenuItems><NavigationView.FooterMenuItems><NavigationViewItem Icon="Setting" Content="设置" Tag="Settings" /></NavigationView.FooterMenuItems><Frame Background="#00000000" x:Name="pagesFrame"></Frame></NavigationView></Grid></Grid>

实现的效果可以自己试下,也可以自行尝试各部件之间的颜色搭配。

自定义背景

更改ImageSource

刚刚你已经设置了应用的背景,接下来就是实现让用户能自定义背景的操作了。

个人建议,把自定义背景的操作放在你应用的设置界面Settings.xaml里。

这里直接放代码。原理就是通过文件选择器选择某张图片,通过流转换成位图,最后再把MainWindow.xaml中背景图片的源设置为该位图。具体是通过buttom,还是checkbox啥的去触发,各位就看自己喜好了。

  private async void changeAppBackground(object sender, RoutedEventArgs e){var filePicker = new FileOpenPicker();var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(MainWindow.current);WinRT.Interop.InitializeWithWindow.Initialize(filePicker, hwnd);filePicker.FileTypeFilter.Add("*");var file = await filePicker.PickSingleFileAsync();if (file != null){BitmapImage bitmapImage = new BitmapImage();FileRandomAccessStream stream = (FileRandomAccessStream)await file.OpenAsync(FileAccessMode.Read);bitmapImage.SetSource(stream);MainWindow.backgroundImage.ImageSource = bitmapImage;}}

别忘了在MainWindow中添加backgroundImage的定义以及对应的初始化。代码如下

   public MainWindow(){this.InitializeComponent();current = this;backgroundImage = ApplicationBackgroundImage;}public static Microsoft.UI.Xaml.Media.ImageBrush backgroundImage;

当然有个问题,每次用户重新打开应用,背景图片都会被更改回默认设置的图片。那么如何解决这个问题捏?等我碰到这个问题的时候再说😋。


http://www.ppmy.cn/news/83953.html

相关文章

基于单片机的数据采集系统

摘 要&#xff1a;本文以AT89C51单片机为核心&#xff0c;设计一个基于单片机的数据采集系统。系统可以采集16路模拟量&#xff0c;精度为12位&#xff0c;16路开关量和2路脉冲量&#xff0c;并将采集到的数据每隔一分钟通过串口发送到PC机。 关键字&#xff1a;AT89C51&#…

18-04 数据库分布式架构

分布式ID UUID 优点&#xff1a; 使用简单无需引入额外组件 缺点 无序&#xff0c;无法实现范围查询插入操作比自增ID性能差不少&#xff08;大概四倍&#xff09;建议用自增ID&#xff08;表的主键&#xff09; UUID&#xff08;唯一标识&#xff09; Redis Incr指令优点…

知识点滴 - dBm和mW的转换

分贝毫瓦dBm&#xff0c;decibel-milliwatts&#xff0c;全写为“decibel relative to one milliwatt”&#xff0c;为一个指代功率的绝对值&#xff0c;而不同于dB只是一个相对值。 dBm或dBmW&#xff08;分贝-毫瓦&#xff09;用于表示功率的水平或级别&#xff0c;以分贝&am…

如何在Ubuntu服务器上安装 QEMU/KVM 以创建虚拟机

KVM是 Kernel-based Virtual Machine 的缩写,是集成到 Linux 内核中的开源类型 1 虚拟机管理程序(裸机虚拟机管理程序)。它允许您创建和管理运行 Windows、Linux 或 UNIX 变体(如 FreeBSD 和 OpenBSD)的虚拟机,每个虚拟机都有自己的虚拟资源,例如存储、内存、CPU、网络接…

Qt在Linux内核中的应用及解析(qtlinux内核)

Qt是跨平台开发的一种工具&#xff0c;尤其适合在Linux内核中的应用开发中使用。Qt能够让开发者在Linux桌面上开发出强大的图形化应用程序&#xff0c;为Linux系统用户提供更加人性化、实用、智能化的服务。本文将从Qt在Linux内核中的应用场景、应用程序开发中的具体使用、以及…

徐延涛:医疗健康企业如何重构客户管理的“营销”与“服务”?

随着人口老龄化和生活健康水平的提升&#xff0c;中国的医疗健康行业市场规模前景向好。《2023易凯资本中国健康产业白皮书》显示&#xff0c;从2022年到2030年的八年里&#xff0c;中国健康产业的整体规模将从10万亿元增长到接近20万亿&#xff0c;年复合增长率将达到9.5%-10%…

Android之Fragment 跳转返回重复加载重复执行onCreateView的四种解决方法

前言&#xff1a; Fragment 跳转返回重复加载重复执行 onCreateView 的问题通常是因为 Fragment 生命周期方法的调用顺序和使用不当所导致的。 1&#xff0c;onSaveInstanceState()方法 一种解决方法是在 Fragment 中使用 onSaveInstanceState() 方法保存 Fragment 的状态&…

【python】制作一个点单小程序!

周末总是在吃的方面&#xff0c;及其纠结&#xff0c;今天来制作一个点单小程序&#xff0c;加入自己喜欢吃的东西&#xff0c;来慢慢挑选&#xff0c;让每个周末快乐无限&#xff01; 一.安装环境 python 3.7.8 QT xlrd、xlwt库使用pip接口进行安装 pip install xlrd pip …