2009-11-18 10 views
45

Chcę produkować w kodzie równowartość tej w XAML:Jak przypisać dynamiczny styl zasobu w kodzie?

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

mogę zrobić tekst i szerokość, ale jak mogę przypisać dynamiczny zasób do stylu:

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

, jak inni tutaj wskazali, odpowiedź, którą zaznaczyłeś jako poprawną, nie robi właściwie tego, co stanowi pytanie. Tutaj jest inna odpowiedź. Powinieneś rozważyć zmianę odpowiedzi, ponieważ niektórzy ludzie czytają zaznaczoną odpowiedź i nic więcej, a oni przegapią poprawne informacje, na czym polega SO. – MarqueIV

Odpowiedz

27

można spróbować:

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

Ciesz się!

+20

Odpowiedź von Samuela jest lepsza, ponieważ jest odpowiednikiem {DynamicResource} w XAML, podczas gdy twoja odpowiedź zmienia tb.Style na aktualną wartość zasobu "FormLabelStyle". tb.Style nie zmienia się, gdy zmienia się zasób "FormLabelStyle". –

3

to powinno działać:

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

Jaka jest różnica między tą metodą a 'SetResourceReference'? – SepehrM

+0

Jest to równoważne 'tb.Style =" FormLabelStyle "'. Oto, czym zajmuje się wewnętrznie opakowanie CLR. – Palec

+0

Powoduje to 'ArgumentException':' 'FormLabelStyle' nie jest poprawną wartością właściwości 'Styl'. Jeśli użyjesz równoważnego 'tb.Style =" FormLabelStyle ";', semantyka jest taka sama (właściwość opakowania CLR wywołuje ten sam kod wewnętrznie), ale zawiedzie w czasie kompilacji ze względu na ścisłe sprawdzanie typu (co jest dobre). – Palec

140

Powinieneś użyć FrameworkElement.SetResourceReference, jeśli chcesz zachować prawdziwe zachowanie DynamicResource - tj. Aktualizację elementu docelowego, gdy zmienia się zasób.

tb.SetResourceReference(Control.StyleProperty, "FormLabelStyle") 
Powiązane problemy