Изменение стилей во время выполнения в 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;
}