Вопрос по wpf, c#, styles – Динамическое изменение стиля XAML в Code Behind, чтобы элементы управления, применяющие этот стиль, также отражали изменение

7

Я хочу иметь возможность установить свойства стиля (и значения) из файла .cs в моем окне WPF.

Моя проблема в том, что если у меня 30 прямоугольников, каждый из которых должен иметь одинаковый стиль (и я не хочу обновлять их все по отдельности). Я хотел бы, чтобы все они были установлены (в файле xaml) в один и тот же стиль, а затем обновили стиль так, чтобы он выглядел так, как мне нравится.

Скажи, что я установилStyle = "key1" в Xaml для каждого прямоугольника. Затем я хочу изменить & quot; key1 & quot; позже, так что все прямоугольники будут отражать это изменение.

Я пробовал вApp.xaml

<code><Application.Resources>
    <Style x:Key="key1" TargetType="Rectangle">
        <Setter Property="Fill" Value="Red"/>
    </Style>
</Application.Resources>
</code>

В MainwWindows.xaml

<code><StackPanel>
    <Rectangle Style="{StaticResource key1}" Height="200" Width="200" x:Name="rect1"/>
    <Button Click="Button_Click" Content="Click"/>
</StackPanel>
</code>

В коде позади

<code>private void Button_Click(object sender, RoutedEventArgs e)
{
    Style style = Application.Current.Resources["key1"] as Style;
    style.Setters.Add(new Setter(Rectangle.VisibilityProperty, Visibility.Collapsed));
}
</code>

Это обновляет стиль, но не обновляет прямоугольники.

Это возможно? Кто-нибудь знает как это сделать? (Пример будет принята с благодарностью).

Я думаю, что вы должны позвонитьUpdate() или жеRefresh() методы для элементов пользовательского интерфейса (только для всего окна или прямоугольника). попробуйте, может быть, это может помочь. stukselbax

Ваш Ответ

2   ответа
2

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

10

DynamicResource так что это может быть изменено во время выполнения. Вам также нужноreplace стиль с новым, не пытайтесь изменить существующий. Это работает:

<StackPanel>
    <Rectangle Style="{DynamicResource key1}" Height="200" Width="200" x:Name="rect1"/>
    <Button Click="Button_Click" Content="Click"/>
</StackPanel>

Style style = new Style {TargetType = typeof(Rectangle)};
style.Setters.Add(new Setter(Shape.FillProperty, Brushes.Red));
style.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed));

Application.Current.Resources["key1"] = style;

Похожие вопросы