Изменить Button.Content через стиль программно - PullRequest
0 голосов
/ 17 мая 2010

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

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

Style aStyle = new Style();  
Setter bSetter = new Setter();
bSetter.Property = Button.ContentProperty;
bSetter.Value = "Some Text"; 
aStyle.Setters.Add(bSetter);
aButton.Style = aStyle;

XAML:

<Button x:Name="aButton" Style="{x:Null}" Click="Button_Click" />

Я мог изменить внешний вид кнопки таким образом, но я не мог изменить содержимое. Кстати, я нашел пример в книге MCTS на WPF.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 17 мая 2010

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

var source = DependencyPropertyHelper.GetValueSource(aButton, ContentControl.ContentProperty);

... чтобы понять это. Я предпочитаю использовать WPF Snoop для этого.

2 голосов
/ 20 мая 2010

Что ж, сегодня я обнаружил, что при установке значений свойств в WPF существует порядок приоритета. Существует множество механизмов для установки значения свойства, и значение свойства зависит от того, как оно было установлено, а не от того, когда оно было установлено.
Установка значения свойства в XAML или с помощью кода всегда будет предшествовать значениям, установленным стилем (а также шаблонами и триггерами). То есть, когда значение свойства задается в XAML или с помощью кода, оно не может быть переопределено установкой стиля.
Чтобы иметь возможность изменять значение свойства с помощью механизма более низкого приоритета, значение должно быть очищено методом DependencyObject.ClearValue.

В моем примере кода выше был еще один метод, который устанавливал свойство Button.Content в коде, поэтому стиль больше не мог его изменить. Решением для этого является добавление ClearValue метода:

Style aStyle = new Style();  
Setter bSetter = new Setter();
bSetter.Property = Button.ContentProperty;
bSetter.Value = "Some Text"; 
aStyle.Setters.Add(bSetter);
aButton.ClearValue(ContentProperty); // <<-- Added this line to clear button content 
aButton.Style = aStyle;
...