Ресурс редактирования WPF

Привет, есть ли способ изменить кисть ресурсов из кода или через какую-то привязку? что я хочу сделать, так это изменить цвет моей «основной» кисти при нажатии кнопки.

Большое спасибо!

Редактировать:

Это GradientBrush, как мне изменить цвета на нем?

myBrush.GradientStops[0].Color = Colors.Red;

просто дает мне исключение ... и есть ли способ анимировать изменение цвета, как раскадровку?


person Peter    schedule 09.02.2009    source источник


Ответы (2)


Чтобы анимировать изменение, попробуйте создать раскадровку и вызвать для нее Begin.

(Я приведу пример)

edit: Похоже, это еще один Silverlight! = Ошибка WPF с моей стороны. Кажется, я не могу заставить это работать в WPF.

person geofftnz    schedule 09.02.2009

Если вы используете шаблон Model-View-ViewModel (MVVM) или что-то подобное, вы можете сделать цвет кисти (или всю кисть) свойством вашей модели просмотра и привязаться к нему напрямую.

По моему (неопытному) мнению, ресурсы не должны меняться во время выполнения. Если что-то изменится, свяжите это.

(edit2: изменено с UserControl верхнего уровня в стиле Silverlight на окно WPF. Как отметил Рэй Буйсен в комментариях, UserControl в WPF будет отображать цвет через DependencyProperty, а не привязан к ViewModel.)

XAML:

<Grid x:Name="LayoutRoot">
    <Grid.Background>
        <SolidColorBrush Color="{Binding BackgroundColor}" />
    </Grid.Background>
    ...

Класс Viewmodel:

public class MyViewModel : INotifyPropertyChanged
{
    public Color BackgroundColor
    {
        get { ... }
        set { ... } // fire PropertyChanged event
    }
    ...

XAML.cs:

public partial class MyWindow : Window
{
     private MyViewModel m_viewmodel;

     public MyWindow()
     {
          InitializeComponent();
          viewmodel = new MyViewModel();
          this.LayoutRoot.DataContext = viewmodel;
     }

     private void ButtonClick(object sender, RoutedEventArgs e)
     {
         this.viewmodel.BackgroundColor = Color.Red;
     }
     ...
person geofftnz    schedule 09.02.2009
comment
Если будет использован шаблонный подход MVVM, у вас даже не будет обработчика Click. Вместо этого вы должны предоставить команду в своем классе MyViewModel (назовите ее ChangeMainBrushCommand или что-то еще), которая запускает логику изменения и заставляет кнопку изменения вашего представления привязать свое свойство Command к вашей настраиваемой команде. - person Adrian; 09.02.2009
comment
Да, но в Silverlight я не могу выполнять команды, поэтому предпочитаю не думать о них :( - person geofftnz; 09.02.2009
comment
Там там. Они запомнят вас, веб-ребята ... в конце концов. - person Adrian; 09.02.2009
comment
Ха-ха ... ирония в том, что я программист WinForms и не касался веб-вещей около 6 лет. Так получилось, что первый проект, который оказался у меня на столе после того, как я решил перейти на WPF, пришлось развернуть через Интернет, так что Silverlight это было ... - person geofftnz; 09.02.2009
comment
Ооо, нет. Если вы используете UserControl, просто выставьте dependencyProperty, а не используйте ViewModel для UI. Следуйте тому же шаблону для пользовательских элементов управления, что и для обычных элементов управления. Потребитель элемента управления может написать затем анимацию для изменения кисти, используя новое свойство зависимости. - person Ray Booysen; 10.02.2009
comment
Извините, я опубликовал код Silverlight2, где Window не существует, и вы должны использовать UserControl для пользовательского интерфейса верхнего уровня. В WPF вы абсолютно правы - UserControl предоставит свойство зависимости. - person geofftnz; 10.02.2009