我正在寻找将整个 wpf 应用程序样式从我的自定义样式交换为默认的 MaterialDesign 样式的方法,如果可能的话,在运行时。非常需要帮助。谢谢
我尝试了这个,但它对于整个应用程序来说并不实用。
namespace MaterialDesign
{
public class ButtonConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool isMaterialDesign = (bool)value;
if (isMaterialDesign)
{
return Application.Current.FindResource("MaterialDesignFlatAccentBgButton");
}
else
{
return Application.Current.FindResource("CustomButtonStyle");
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
//app.xaml
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Default.xaml" />
//窗口.xaml
<Window.Resources>
<local:GenericConverter x:Key="StyleConverter"/>
</Window.Resources>
<Grid>
<materialDesign:Card Padding="20" Margin="70" VerticalAlignment="Center">
<StackPanel>
<TextBlock Text="Welcome" Style="{StaticResource MaterialDesignHeadline6TextBlock}" HorizontalAlignment="Center" Margin="0 40 0 0"/>
<TextBox materialDesign:HintAssist.Hint="Username" Margin="0 0 0 8"/>
<PasswordBox materialDesign:HintAssist.Hint="Password" Margin="0 0 0 8" Password=""/>
<StackPanel Orientation="Vertical" HorizontalAlignment="Center">
<Button HorizontalAlignment="Center" Content="Login" Style="{Binding IsMaterialDesign, Converter={StaticResource StyleConverter}}" Margin="0 0 10 0"/>
<Button HorizontalAlignment="Center" Content="Register" Margin="0 10 10 0"/>
</StackPanel>
<TextBlock HorizontalAlignment="Center" Text="Don't have an account?" Style="{StaticResource MaterialDesignDataGridTextColumnStyle}" Margin="0 10"/>
<TextBlock HorizontalAlignment="Center" Text="Register here" TextDecorations="Underline" Cursor="Hand" Margin="0 0 0 10"/>
</StackPanel>
</materialDesign:Card>
<ToggleButton
x:Name="DarkModeToggle"
Checked="DarkModeToggle_Checked"
Unchecked="DarkModeToggle_Checked"
Style="{StaticResource MaterialDesignSwitchToggleButton}"
ToolTip="Default ToggleButton Style" Margin="0 300 0 0"/>
</Grid>
</Window>
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
我正在为整个应用程序寻找一个实用的解决方案,甚至在加载MaterialDesign时使MaterialDesign默认样式覆盖我的自定义样式。
如果你想在运行时更改主题,你需要制作动态样式,而不是静态样式。
所以不是
{StaticResource SomeStyle}
,而是 -> {DynamicResource SomeStyle}
。
然后,您需要为两个主题(材料设计和您的主题)具有相同的名称样式,因为按钮将具有这种动态样式,并且它会在您需要时随时更改(使用按钮或其他控件),它将尝试搜索对于提供的新主题上的同名样式。
它应该根据需要进行更改,我已经这样做了,按照这个youtube教程,我希望这会有所帮助。