Как изменить DynamicResource из кода С#?

У меня есть простая кнопка «Воспроизведение/Пауза», которая показывает значок «Воспроизведение» в начале приложения. Вот его код:

<Button x:Name="playPauseButton" Style="{DynamicResource MetroCircleButtonStyle}" 
                        Content="{DynamicResource appbar_control_play}"
                        HorizontalAlignment="Left" Margin="77,70,0,0" VerticalAlignment="Top" Width="75" Height="75" Click="Button_Click"/>`

Что я хочу сделать, так это изменить значок воспроизведения на значок паузы при нажатии. Все, что мне нужно сделать, это изменить содержимое на {DynamicResource appbar_control_pause}. Однако, когда я делаю следующее:

playPauseButton.Content = "{DynamicResource appbar_control_stop}";

он показывает только строку буквально внутри кнопки. Как я могу изменить это свойство?


person MeLlamoPablo    schedule 10.04.2015    source источник
comment
возможный дубликат Программное связывание WPF   -  person pquest    schedule 10.04.2015
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 10.04.2015


Ответы (1)


Строки, которые вы пишете в XAML с помощью { }, являются особыми (они называются Расширения разметки), поэтому процессор XAML не обрабатывает их как "строки" (вместо этого он вызывает расширение для предоставления результирующего объекта вместо прямого назначения строки). . В частности, вы будете использовать расширение разметки DynamicResource. здесь.

Но это работает только на процессоре XAML, поэтому, когда вы назначаете свойство Content с помощью строки из кода C#, оно просто назначает конкретную строку: она вообще не анализируется процессором XAML (и расширение разметки DynamicResource никогда не вызывается).

Если вы хотите загрузить ресурс в код, вы можете попробовать:

playPauseButton.Content = FindResource("appbar_control_stop");

Или, если вы хотите сделать это так, как это сделал бы DynamicResource, вы можете попробовать SetResourceReference, например:

playPauseButton.SetResourceReference(ContentControl.ContentProperty, "appbar_control_stop");

Этот второй метод назначит реальную ссылку на ресурс (вместо того, чтобы просто загрузить его), поэтому, если ресурс изменится (из-за изменения родителя, использования событий или чего-то еще), свойство будет переоценено.

person Jcl    schedule 10.04.2015
comment
Это сделало это! Большое спасибо :) Извините, если вопрос был слишком глупым, но я новичок в WPF, и это довольно запутанно. - person MeLlamoPablo; 10.04.2015
comment
Мы все были новичками, поэтому я попытался объяснить проблему, а не просто дать решение. Рад, что смог помочь - person Jcl; 10.04.2015