C# WPF 切换主题的几种方法

By jerryxjr1220 at 2023-11-02 • 0人收藏 • 349人看过
<hc:GlowWindow x:Class="WpfThemeDemo.Views.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:model="clr-namespace:WpfThemeDemo.Models"
        xmlns:vm="clr-namespace:WpfThemeDemo.ViewModels"
        xmlns:view="clr-namespace:WpfThemeDemo.Views"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:local="clr-namespace:WpfThemeDemo"
        xmlns:hc="https://handyorg.github.io/handycontrol"
        d:DataContext="{d:DesignInstance Type=vm:MainViewModel}"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" 
        FontFamily="JetBrains Mono" 
        FontSize="{StaticResource TextFontSize}">
    <hc:GlowWindow.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
        <Style x:Key="TextBlockTheme" TargetType="{x:Type TextBlock}">
            <Style.Triggers >
                <DataTrigger Binding="{Binding ElementName=tbTheme, Path=IsChecked}" Value="True">
                    <Setter Property="Foreground" Value="LightBlue" />
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=tbTheme, Path=IsChecked}" Value="False">
                    <Setter Property="Foreground" Value="DarkBlue" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style x:Key="TextBoxTheme" TargetType="{x:Type TextBox}">
            <Style.Triggers >
                <DataTrigger Binding="{Binding ElementName=tbTheme, Path=IsChecked}" Value="True">
                    <Setter Property="Foreground" Value="Blue" />
                    <Setter Property="Background" Value="White" />
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=tbTheme, Path=IsChecked}" Value="False">
                    <Setter Property="Foreground" Value="White" />
                    <Setter Property="Background" Value="Gray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style x:Key="ButtonTheme" TargetType="{x:Type Button}">
            <Style.Triggers >
                <DataTrigger Binding="{Binding ElementName=tbTheme, Path=IsChecked}" Value="True">
                    <Setter Property="Foreground" Value="{DynamicResource InfoBrush}" />
                    <Setter Property="Background" Value="White"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=tbTheme, Path=IsChecked}" Value="False">
                    <Setter Property="Foreground" Value="White" />
                    <Setter Property="Background" Value="DarkBlue"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style x:Key="ToggleButtonTheme" TargetType="{x:Type ToggleButton}">
            <Style.Triggers >
                <DataTrigger Binding="{Binding ElementName=tbTheme, Path=IsChecked}" Value="True">
                    <Setter Property="Foreground" Value="{DynamicResource InfoBrush}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=tbTheme, Path=IsChecked}" Value="False">
                    <Setter Property="Foreground" Value="DarkBlue"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

    </hc:GlowWindow.Resources>
    <Grid>
        <StackPanel Grid.Column="0">
            <TextBlock Text="Light Theme" FontSize="20" Margin="20" Style="{DynamicResource TextBlockTheme}" />
            <TextBox Width="400" FontSize="20" Margin="20" Style="{DynamicResource TextBoxTheme}"/>
            <Button Content="Button" FontSize="20" Height="45" HorizontalAlignment="Center" Style="{DynamicResource ButtonTheme}"/>
        </StackPanel>
        <ToggleButton Grid.Column="0" Content="Theme" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="20"
                      Style="{StaticResource ToggleButtonTheme}" x:Name="tbTheme" IsChecked="True" Width="100" Click="TbTheme_OnClick"/>
        
    </Grid>
</hc:GlowWindow>
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
using HandyControl.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfThemeDemo.Models;
using WpfThemeDemo.ViewModels;
using MessageBox = HandyControl.Controls.MessageBox;

namespace WpfThemeDemo.Views
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : GlowWindow
    {
        private MainViewModel mainViewModel;
        public MainWindow()
        {
            InitializeComponent();

            #region 注册并接受消息

            //WeakReferenceMessenger.Default.Register<CustomizedMessage>(this, (o, m) => { MessageBox.Show("Received!"); });

            #endregion


            mainViewModel = new MainViewModel();
            this.DataContext = mainViewModel;

            
        }


        private void TbTheme_OnClick(object sender, RoutedEventArgs e)
        {
            if (tbTheme.IsChecked == true)
                this.Background = Brushes.White;
            else
                this.Background = Brushes.Gray;

        }
    }
}


2 个回复 | 最后更新于 2023-11-03
2023-11-03   #1

用资源字典好点吧,替换字典整个都改变

2023-11-03   #2

回复#1 @aubreychao :

是的,这样改也可以

Application.Current.Resources["Key"] = new ...


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...