动态更改WPF中的控件样式

时间:2014-10-20 14:24:41

标签: wpf

我为各种控件定义了样式即。文本框,组合框,日期选择器等。在我的应用程序中。这些样式所需的资源存在于其他样式中,所有样式都存在于ResourceDictionary中。

我想根据一些配置设置将这些控件的背景颜色更改为黄色。

我正在考虑使用附加属性并将它们与样式一起使用并设置背景颜色。但不确定如何实现它。

请建议是否有其他方法。

谢谢,

阿卜迪

1 个答案:

答案 0 :(得分:0)

你可以尝试这个解决方案:

视图

'myForm'或其他任何方式调用您的窗口:

我在这种情况下使用了一些radiobuttons。每个都有相关的颜色您可以根据您的要求进行调整。

<UniformGrid Columns="0"  
             x:Name="_skinChanger" 
             Grid.Column="0" Grid.Row="1" Width="200">
    <RadioButton x:Name="BlueSkin"
                Content="Blue Skin" HorizontalAlignment="Left" Width="131" />
    <RadioButton x:Name="None"
                Content="No Skin"
                IsChecked="True" HorizontalAlignment="Left" Width="87" />
    <RadioButton x:Name="RedSkin"
                Content="Red Skin" Margin="0,0,0,4" HorizontalAlignment="Left" Width="109" />
    <RadioButton x:Name="GreenSkin"
                Content="Green Skin" HorizontalAlignment="Left" Width="109" />
</UniformGrid>

要更改样式的元素应使用动态资源:

...

Style="{DynamicResource LabelStyle}"

...

在您的窗口构造函数中,例如 ...

Loaded += RuntimeSkinning_Loaded;

然后在班级中定义事件。

void RuntimeSkinning_Loaded(object sender, RoutedEventArgs e)
{
    // this is my uniformgrid where the radiobuttons are placed. I add a handled for
    // the checkedevent. 
    _skinChanger.AddHandler(RadioButton.CheckedEvent, new RoutedEventHandler(OnSkinChanged));
}

private void OnSkinChanged(object sender, RoutedEventArgs e)
{
    string name = (e.OriginalSource as RadioButton).Name;
    _registerForm.Resources.Clear();
    _registerForm.Resources.MergedDictionaries.Clear();

    if (name == "None") return;

    ResourceDictionary skin =
            Application.LoadComponent(new Uri("/myproject;component/Skins/" + name + ".xaml", UriKind.Relative)) as ResourceDictionary;
    _registerForm.Resources.MergedDictionaries.Add(skin);

    e.Handled = true;
}