2009-11-18 2 views
45

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

<TextBlock 
Text="Title:" 
Width="{Binding FormLabelColumnWidth}" 
Style="{DynamicResource FormLabelStyle}"/> 

я могу сделать текст и ширину, но как я могу назначить динамический ресурс стиля:

TextBlock tb = new TextBlock(); 
      tb.Text = "Title:"; 
      tb.Width = FormLabelColumnWidth; 
      tb.Style = ??? 
+5

как указано здесь, вы указали, что ответ, который вы отметили как правильно, фактически не выполняет то, что задает вопрос. Здесь есть еще один ответ. Вы должны подумать об изменении своего ответа соответственно, потому что некоторые люди читают отмеченный ответ, и ничего больше, и они будут пропускать правильную информацию, о которой идет речь. – MarqueIV

ответ

27

Вы можете попробовать:

tb.Style = (Style)FindResource("FormLabelStyle"); 

Наслаждайтесь!

+20

Ответ von Samuel лучше, так как он эквивалентен {DynamicResource} в XAML, а ваш ответ изменяет tb.Style на текущее значение ресурса «FormLabelStyle». tb.Style не изменяется при изменении ресурса «FormLabelStyle». –

3

Это должно работать:

tb.SetValue(Control.StyleProperty, "FormLabelStyle"); 
+4

В чем разница между этим методом и 'SetResourceReference'? – SepehrM

+0

Это эквивалентно 'tb.Style =" FormLabelStyle "'. Это то, что делает оболочка CLR внутренне. – Palec

+0

Это порождает 'ArgumentException':' 'FormLabelStyle 'не является допустимым значением для свойства« Style ». Если вы используете эквивалентный' tb.Style =' FormLabelStyle ";', семантика одинакова (свойство оболочки CLR вызывает тот же код внутри), но он не работает во время компиляции из-за строгой проверки типа (что хорошо). – Palec

140

Вы должны использовать FrameworkElement.SetResourceReference, если хотите истинное поведение DynamicResource - то есть обновление целевого элемента при изменении ресурса.

tb.SetResourceReference(Control.StyleProperty, "FormLabelStyle") 
Смежные вопросы