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

Я хочу иметь возможность установить свойства стиля (и значения) из файла .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>

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

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

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

Ответы на вопрос(2)

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

Решение Вопроса

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;

Ваш ответ на вопрос