Je veux produire dans le code l'équivalent de ceci en XAML:
<TextBlock
Text="Title:"
Width="{Binding FormLabelColumnWidth}"
Style="{DynamicResource FormLabelStyle}"/>
Je peux faire le texte et la largeur, mais comment puis-je affecter la ressource dynamique au style:
TextBlock tb = new TextBlock();
tb.Text = "Title:";
tb.Width = FormLabelColumnWidth;
tb.Style = ???
Tu peux essayer:
tb.Style = (Style)FindResource("FormLabelStyle");
Prendre plaisir!
Vous devez utiliser FrameworkElement.SetResourceReference si vous voulez un comportement True DynamicResource - c'est-à-dire une mise à jour de l'élément cible lorsque la ressource change.
tb.SetResourceReference(Control.StyleProperty, "FormLabelStyle")
Cela devrait fonctionner:
tb.SetValue(Control.StyleProperty, "FormLabelStyle");
La question initiale était de savoir comment le rendre dynamique, ce qui signifie que si la ressource change, le contrôle sera mis à jour. La meilleure réponse ci-dessus utilisée a été SetResourceReference. Pour le framework Xamarin, ceci n'est pas disponible mais SetDynamicResource l'est et il fait exactement ce que l'affiche originale demandait. Exemple simple
Label title = new Label();
title.Text = "Title";
title.SetDynamicResource(Label.TextColorProperty, "textColor");
title.SetDynamicResource(Label.BackgroundColorProperty, "backgroundColor");
J'appelle maintenant:
App.Current.Resources["textColor"] = Color.AliceBlue;
App.Current.Resources["backgroundColor"] = Color.BlueViolet;
Fait en sorte que les propriétés changent pour tous les contrôles utilisant la ressource. Cela devrait fonctionner pour n'importe quelle propriété.