将我的应用程序的整个样式从自定义样式切换为默认的materialDesignStyles

问题描述 投票:0回答:1

我正在寻找将整个 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默认样式覆盖我的自定义样式。

wpf
1个回答
0
投票

如果你想在运行时更改主题,你需要制作动态样式,而不是静态样式。

所以不是

{StaticResource SomeStyle}
,而是 ->
{DynamicResource SomeStyle}
。 然后,您需要为两个主题(材料设计和您的主题)具有相同的名称样式,因为按钮将具有这种动态样式,并且它会在您需要时随时更改(使用按钮或其他控件),它将尝试搜索对于提供的新主题上的同名样式。

它应该根据需要进行更改,我已经这样做了,按照这个youtube教程,我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.