Изменение стилей во время выполнения в WPF

Я пытаюсь разрешить пользователю настраивать элементы в приложении WPF. То, что я пытаюсь достичь, заключается в том, что если у меня есть окно списка, в котором указаны все элементы формы (TextBox, ярлык и т.д.), Пользователь может выбрать один элемент формы и установить свойство стиля. Ярлык, переднем плане должен быть оранжевый, где TextBox переднего плана должен быть черным и так далее. И в зависимости от того, какой стиль я намереваюсь применить, все текстовые поля должны выглядеть одинаково.

Я не могу найти способ добиться этого. Я попробовал пример, в котором во время выполнения можно загрузить несколько предварительно определенных стилей. Итак, теперь я хотел бы найти способ изменения свойства разных элементов во время выполнения.

UPDATE:

Я попытался создать новый стиль из кода.

XAML

<Label Content="SAMPLE" Style="{DynamicResource Style1}" x:Name="label1" />
<Button Content="Button" Click="Button_Click" />

и в коде, то есть при щелчке кнопки Я пробовал это:

Style style = new Style { TargetType = typeof(Label) };
style.Setters.Add(new Setter(Control.ForegroundProperty, Brushes.Black));
Application.Current.Resources["Style1"] = style;

Но он не обновляется.

Спасибо.

Ответ 1

Вы должны убедиться, что стили находятся в файле App.xaml:

<Application x:Class="ChangeStyleHelp.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">

    <Application.Resources>
        <Style x:Key="MyStyle" TargetType="{x:Type Label}">
            <Setter Property="Background" Value="Green" />
        </Style>
    </Application.Resources>
</Application>

Код позади:

private void ChangeStyle_Click(object sender, RoutedEventArgs e)
{
    Style style = new Style 
    { 
        TargetType = typeof(Label) 
    };

    style.Setters.Add(new Setter(Label.BackgroundProperty, Brushes.Aquamarine));

    Application.Current.Resources["MyStyle"] = style;
}   

Если Style находится в ресурсе Window (Window.Resources), вам нужно написать this или имя Window:

private void ChangeStyle_Click(object sender, RoutedEventArgs e)
{
    Style style = new Style 
    { 
        TargetType = typeof(Label) 
    };

    style.Setters.Add(new Setter(Label.BackgroundProperty, Brushes.Aquamarine));

    this.Resources["MyStyle"] = style;
}   

Кроме того, вы можете изменить Style следующим образом: взять существующий стиль и использовать элемент. Пример:

<Application x:Class="ChangeStyleHelp.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">

    <Application.Resources>
        <Style x:Key="AnotherWayStyle" TargetType="{x:Type Label}">
            <Setter Property="Background" Value="Lavender" />
            <Setter Property="Foreground" Value="OrangeRed" />
        </Style>
    </Application.Resources>
</Application>  

Код позади:

private void AnotherWay_Click(object sender, RoutedEventArgs e)
{
    label1.Style = (Style)Application.Current.Resources["AnotherWayStyle"];
}   

Ответ 2

Пробовали ли вы использовать Словари ресурсов

Словарь ресурсов

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="TextColor" Color="#FF121212"/>
</ResourceDictionary>

XAML для управления

<TextBox Text="TextBox" Foreground="{DynamicResource TextColor}" />

Код для изменения стилей во время выполнения

     var rd = new ResourceDictionary();
     rd.Add("TextColor", "#FFFFFF");
     Application.Current.Resources.MergedDictionaries.Add(rd);

Это объединит ваши новые стили с существующими, и это изменение будет автоматически отражено на всех элементах управления, связанных с этими стилями.

Ответ 3

он работал у меня как шарм:

Xaml:

<TreeView x:Name="TreePeople">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView> 

С#:

bool Expanded = false; 
// The event subscription method (for a button click)
private void ButtonExpand__Click(object sender, RoutedEventArgs e)
{
    Expanded = !Expanded;
    Style Style = new Style
    {
        TargetType = typeof(TreeViewItem)
    };

    Style.Setters.Add(new Setter(TreeViewItem.IsExpandedProperty, Expanded));
    TreePeople.ItemContainerStyle = Style;
}