I'm working with a Xamarin.Forms app. the following Style I've defined in App.xaml
<Application.Resources>
<ResourceDictionary>
<Style x:Key="blueButton" TargetType="Button">
<Setter Property="BackgroundColor"
Value="Blue" />
<Setter Property="TextColor"
Value="White" />
</Style>
</ResourceDictionary>
</Application.Resources>
When I want to use the Style from MainPage.xaml, it works just fine.
<Button x:Name="CreateGridButton"
Margin="0,15,0,0"
Clicked="CreateGridButton_Clicked"
Text="Create Grid Layout" Style="{StaticResource blueButton}" />
But when I want to do the same from MainPage.xaml.cs, it shows the error message "The name 'blueButton' does not exist in the Current Context".
Button createSL = new Button();
createSL.Text = "Create Stack Layout";
createSL.Style = (Style)Resources["blueButton"];
I also tried the following, which also showed the same error.
createSL.Style = bluebutton;
As per my requirement, I can not create this button in XAML. So kindly help me do it from Code behind.
Please try to do this way
Create style in your App constructor and add this in resource like this:
public App ()
{
var buttonStyle = new Style (typeof(Button)) {
Setters = {
...
new Setter { Property = Button.TextColorProperty, Value = Color.Teal }
}
};
Resources = new ResourceDictionary ();
Resources.Add ("blueButton", buttonStyle);
...
}
After that use this style and set to button like this:
Button createSL = new Button();
createSL.Text = "Create Stack Layout";
createSL.Style = (Style)Application.Current.Resources ["blueButton"];
Since you defined your style inside App.xaml:
createSL.Style = (Style)Application.Current.Resources["blueButton"];
Styles can be defined at local and application level:
var buttonWithStyleFromLocalResources = button1; //button1 defined in XAML
var buttonWithStyleFromApplicationResources = button2; //button2 defined in XAML
ResourceDictionary localResourceDictionary = Resources;
//try to access local style with key "KeyForStyle"
if (localResourceDictionary.TryGetValue("KeyForStyle", out object value) && value is Style)
{
buttonWithStyleFromLocalResources.Style = (Style)value;
}
//try to access application style with key "KeyForStyle" (from App.xaml)
ResourceDictionary applicationResourceDictionary = Application.Current.Resources;
if (applicationResourceDictionary.TryGetValue("KeyForStyle", out value) && value is Style)
{
buttonWithStyleFromApplicationResources.Style = (Style)value;
}
Context: Xamarin Forms, C#.
I developed the function GetStyleFromApplicationResource() for use in my project to load a label Style from code.
Below is a class to load the Style from a local or Application ResourceDictionary. A sample XAML and XAML.cs file is included to answer the original poster's question.
Credit to @Benl for pointing out the difference between local and Application resources.
//GenFunc.cs
namespace MyApp
{
public static class GenFunc
{
public static Style GetStyleFromLocalResource(ResourceDictionary localresource, String ResourceNameKey)
{
if( (localresource.TryGetValue(ResourceNameKey, out Object retValue)) &&
(retValue is Style value))
{
return value;
}
throw new Exception($"Style '{ResourceNameKey}' not found in local ResourceDictionary");
}
public static Style GetStyleFromApplicationResource(String ResourceNameKey)
{
if( (Application.Current.Resources.TryGetValue(ResourceNameKey, out Object retValue)) &&
(retValue is Style value))
{
return value;
}
throw new Exception($"Style '{ResourceNameKey}' not found in Application ResourceDictionary");
}
}
}
//Test.xaml.cs
using MyApp;
using System;
using System.Reflection;
using Xamarin.Forms;
namespace MyApp.Pages
{
public partial class Test : ContentPage
{
public Test()
{
}
protected override void OnAppearing()
{
base.OnAppearing();
Style btnStyle = new Style(typeof(Button));
try
{
lblStyle = GenFunc.GetStyleFromLocalResource(Resources, "blueButton");
}
catch (Exception e)
{
Console.WriteLine(e);
}
try
{
lblStyle = GenFunc.GetStyleFromApplicationResource("blueButton");
}
catch (Exception e)
{
Console.WriteLine(e);
}
Button createSL = new Button();
createSL.Text = "Create Stack Layout";
createSL.Style = btnStyle;
SL0.Children.Add(createSL);
}
}
}
//Test.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage Title="Test"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
x:Class="MyApp.Pages.Test"
ios:Page.UseSafeArea="true">
<ContentPage.Content>
<StackLayout x:Name="SL0" Margin="10,0">
</StackLayout>
</ContentPage.Content>
</ContentPage>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With