WPF/C#:更改界面的样式

23 篇文章 2 订阅

项目结构:

image-20240614092633157

先来看看BlueSkin.xaml与YellowSkin.xaml。

BlueSkin.xaml:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SkinnedApplication">
  <Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Blue" />
  </Style>
  <Style TargetType="{x:Type local:ChildWindow}">
    <Setter Property="Background" Value="Blue" />
  </Style>
  <Style TargetType="{x:Type local:MainWindow}">
    <Setter Property="Background" Value="Blue" />
  </Style>
</ResourceDictionary>

YellowSkin.xaml:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SkinnedApplication">
  <Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Yellow" />
  </Style>
  <Style TargetType="{x:Type local:ChildWindow}">
    <Setter Property="Background" Value="Yellow" />
  </Style>
  <Style TargetType="{x:Type local:MainWindow}">
    <Setter Property="Background" Value="Yellow" />
  </Style>
</ResourceDictionary>

都是在ResourceDictionary中包含了一些Style。

资源字典(ResourceDictionary)介绍

现在来看看ResourceDictionary是什么?

在WPF中,资源字典(ResourceDictionary)是一个非常重要的特性,它用于存储和管理可重用的资源,如样式、控件模板、颜色、字体等。通过使用ResourceDictionary,你可以在一个集中的位置定义这些资源,并在整个应用程序中重用它们,这有助于保持应用程序的一致性和减少代码的重复。

image-20240614093438082

资源字典是应用使用的 XAML 资源(如样式)的存储库。 在 XAML 中定义资源,然后可以使用 {StaticResource} 标记扩展和 {ThemeResource} 标记扩展在 XAML 中检索它们。 还可以使用代码访问资源,但这并不常见。 你可以使用资源来强制在整个应用中一致地使用某些值,例如画笔颜色或像素度量。

样式(Style)介绍

知道了ResourceDictionary是什么,现在再来看看Style是什么?

在WPF中,样式(Style)是一种定义一组属性值的方式,这些属性值可以应用于一个或多个UI元素,以此来改变它们的外观和行为。样式类似于CSS(层叠样式表)中的样式,它允许开发者在一个集中的位置定义UI元素的外观,然后在整个应用程序中重用这些定义。

image-20240614094156858

Style类在类型的不同实例之间共享属性、资源和事件处理程序。

可以这样子使用:

<Style x:Key="Style1">
  <Setter Property="Control.Background" Value="Yellow"/>
</Style>

应用它,只需要这样子写:

<Label Content="Yellow Background" Style="{StaticResource Style1}" />

还可以使用 TargetType 属性将样式应用于给定类型的所有元素。 将目标类型添加到样式意味着不再需要使用语法完全限定所设置 ClassName.PropertyName 的属性。 以下示例定义将应用于每个 TextBlock 元素的样式。

<Style TargetType="{x:Type TextBlock}">
  <Setter Property="FontFamily" Value="Segoe Black" />
  <Setter Property="HorizontalAlignment" Value="Center" />
  <Setter Property="FontSize" Value="12pt" />
  <Setter Property="Foreground" Value="#777777" />
</Style>

以上的BlueSkin.xaml与YellowSkin.xaml就是使用这种用法。

将资源字典加载到应用程序属性字典

App.xaml:

<Application x:Class="SkinnedApplication.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:SkinnedApplication"
             StartupUri="MainWindow.xaml" Startup="App_Startup" />

其中

Startup="App_Startup"

Startup是Application类的一个事件,当应用程序启动并准备好运行时触发。这个事件在应用程序的主窗口显示之前发生,因此它是执行初始化操作(如加载资源、配置或数据)的理想位置。

App_Startup是这个事件的处理程序,在App.cs中定义:

 private void App_Startup(object sender, StartupEventArgs e)
 {
     Properties["Blue"] = (ResourceDictionary) LoadComponent(new Uri("BlueSkin.xaml", UriKind.Relative));
     Properties["Yellow"] = (ResourceDictionary) LoadComponent(new Uri("YellowSkin.xaml", UriKind.Relative));
 }

这段代码位其目的是在应用程序启动时加载两个资源字典,分别代表两种不同的皮肤或主题,然后将这些资源字典存储在应用程序的属性字典中以供后续使用。

Properties是Application类的一个属性,它提供了一个键值对的集合,可以用来存储应用程序范围内的数据。

LoadComponent方法是WPF中用于加载XAML文件并创建相应对象的方法。

在这里我们又遇到了一个新的概念:属性字典(Properties Dictionary)。

属性字典(Properties Dictionary)介绍

在WPF应用程序中,属性字典(Properties Dictionary)是Application类提供的一个功能,允许开发者在应用程序范围内存储和检索键值对数据。这个属性字典可以用来保存应用程序的配置信息、状态数据或者任何需要在不同组件或页面间共享的数据。

属性字典的主要特点包括:

  • 应用程序范围:存储在属性字典中的数据在整个应用程序的生命周期内都是可用的,这意味着不同的窗口、页面或控件都可以访问和修改这些数据。
  • 键值对存储:属性字典以键值对的形式存储数据,其中键是一个唯一的字符串,值可以是任何类型的对象。
  • 动态类型:由于属性字典中的值是以object类型存储的,因此在检索值时通常需要进行类型转换。

属性字典非常适合用来存储那些需要在应用程序的多个部分之间共享的数据,但是它不适合用来存储大量的数据或者需要频繁更新的数据,因为这可能会影响应用程序的性能。

切换样式的实现

MainWindow.xaml如下:

<Window x:Class="SkinnedApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SkinnedApplication"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <Button Name="newChildWindowButton" Click="newChildWindowButton_Click">New ChildWindow</Button>
        <StackPanel Orientation="Horizontal">
            <Label>Skin:</Label>
            <ComboBox Name="skinComboBox" />
        </StackPanel>
    </StackPanel>
</Window>

MainWindow.cs如下:

using System.Windows;
using System.Windows.Controls;

namespace SkinnedApplication
{
    /// <summary>
    ///     Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // Add choices to combo box
            skinComboBox.Items.Add("Blue");
            skinComboBox.Items.Add("Yellow");
            skinComboBox.SelectedIndex = 0;

            // Set initial skin
            Application.Current.Resources = (ResourceDictionary) Application.Current.Properties["Blue"];

            // Detect when skin changes
            skinComboBox.SelectionChanged += skinComboBox_SelectionChanged;
        }

        private void newChildWindowButton_Click(object sender, RoutedEventArgs e)
        {
            // Create a new skind child window
            var window = new ChildWindow();
            window.Show();
        }

        private void skinComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // Change the skin
            var selectedValue = (string) e.AddedItems[0];
            Application.Current.Resources = (ResourceDictionary) Application.Current.Properties[selectedValue];
        }
    }
}
Application.Current.Resources = (ResourceDictionary) Application.Current.Properties["Blue"];

初始化一个主题或者皮肤。

Application.Current.Resources = (ResourceDictionary) Application.Current.Properties[selectedValue];

切换样式。

最终实现的效果如下所示:

image-20240614101753390

切换到:

image-20240614101827246

总结

通过这个例子我们简单了解了WPF中的资源字典(ResourceDictionary)、样式(Style)、属性字典(Properties Dictionary)以及一种实现WPF应用更换主题的思路,希望对你有所帮助。

参考

1、ResourceDictionary 类 (Windows.UI.Xaml) - Windows UWP applications | Microsoft Learn

2、Style 类 (System.Windows) | Microsoft Learn

3、Application.Properties 属性 (System.Windows) | Microsoft Learn

代码来源

[WPF-Samples/Application Management/SkinnedApplication at main · microsoft/WPF-Samples (github.com)]

欢迎关注微信公众号:DotNet学习交流。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要用WPF制作登录界面,您需要了解WPF的基本知识和使用方法。您可以使用Visual Studio创建WPF项目,然后在项目中添加用户界面元素,如文本框、标签和按钮等,并使用C#代码实现登录功能。 下面是一个简单的例子: 1. 在Visual Studio中创建一个WPF项目。 2. 在主窗口上添加文本框,用于输入用户名。 3. 添加另一个文本框,用于输入密码。 4. 添加一个按钮,用于执行登录操作。 5. 在按钮的单击事件处理程序中,实现登录逻辑。 您可以根据您的需求适当地扩展和修改以上步骤,完成更加复杂的登录界面。 ### 回答2: WPF(Windows Presentation Foundation)是一种用于创建用户界面的技术,它提供了丰富的图形和交互功能,适用于开发各种类型的应用程序,包括登录界面。 使用WPF制作登录界面可以通过以下步骤实现: 1. 创建WPF应用程序项目:在Visual Studio中创建一个新的WPF应用程序项目。 2. 设计界面:使用XAML语言定义界面布局和控件,例如,使用Grid面板进行布局,并添加TextBox、Label、Button等控件来实现用户名和密码的输入和登录按钮。 3. 添加样式和主题:可以使用预定义的样式和主题来美化界面,增加用户体验。可以使用WPF的内置样式或自定义样式。 4. 数据绑定:将输入的用户名和密码与后台代码进行绑定,以便在点击登录按钮时获得用户输入的值,并与预先设置好的用户信息进行比对。 5. 添加登录逻辑:在点击登录按钮后,使用逻辑代码验证用户输入的用户名和密码。如果验证通过,则进入应用程序的主界面,否则弹出错误提示。 6. 添加事件处理:处理各个控件的事件,例如,按下回车键时自动切换到密码输入框,禁用空白用户名或密码的登录等。 7. 错误处理和验证:对用户输入进行验证,确保输入的用户名和密码格式正确,并提供错误提示。可以使用WPF的数据验证机制来处理输入数据的合法性。 8. 打包和发布:完成界面设计和逻辑编写后,构建和发布项目,生成可执行文件或安装程序。 综上所述,使用WPF制作登录界面需要设计界面、添加样式和主题、数据绑定、添加登录逻辑、事件处理、错误处理和验证,最后进行打包和发布。WPF提供了丰富的功能和易于使用的工具,可以帮助开发人员创建出漂亮、交互性强的登录界面。 ### 回答3: 用WPF(Windows Presentation Foundation)制作登录界面是一种常见的做法。 WPF 是一种用于构建 Windows 客户端应用程序的UI框架。通过使用XAML(可扩展应用程序标记语言)和C#等编程语言,可以轻松地创建具有丰富用户界面和交互功能的应用程序。 首先,我们可以创建一个新的WPF项目。在Visual Studio中,选择“新建项目”,然后选择“WPF应用程序”。这将创建一个包含默认窗体的项目。 接下来,我们可以在窗体中添加界面元素。例如,我们可以添加一个文本框和一个密码框用于输入用户名和密码,还可以添加一个“登录”按钮和一个“取消”按钮。可以使用XAML或C#代码设置这些界面元素的样式和属性。 然后,我们需要为登录按钮和取消按钮添加事件处理程序。当用户点击登录按钮时,我们可以检查输入的用户名和密码是否与预期的匹配,如果匹配,则登录成功,可以显示欢迎消息或打开主窗口。如果不匹配,则可以显示错误消息并清除输入。 另外,我们可以添加其他功能,例如记住密码的复选框、忘记密码的链接等。还可以对输入进行验证,确保输入的格式符合要求。 最后,我们可以通过添加动画、美化界面等方式进一步改进登录界面的外观和用户体验效果。 总的来说,使用WPF制作登录界面是相对简单的。通过利用WPF提供的丰富功能和灵活性,我们可以创建出具有吸引力和交互性的登录界面,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值