C# WPF 切换主题的几种方法
By
jerryxjr1220
at 2023-11-02 • 0人收藏 • 549人看过
<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
#2
登录后方可回帖
用资源字典好点吧,替换字典整个都改变