の動的スタイル Xamarin.Forms

サンプルのダウンロードサンプルのダウンロード

スタイルはプロパティの変更に応答せず、アプリケーションの期間中は変更されません。 たとえば、Style をビジュアル要素に割り当てた後、Setter インスタンスの 1 つが変更、削除、または追加された新しい Setter インスタンスの場合、変更はビジュアル要素に適用されません。 ただし、アプリケーションは、動的リソースを使用して実行時に動的にスタイルの変更に応答できます。

マークアップ拡張機能は DynamicResource 、両方ともディクショナリ キーを StaticResource 使用して から値をフェッチするという点で、マークアップ拡張機能に ResourceDictionary似ています。 ただし、 は StaticResource 1 つのディクショナリ検索を実行しますが、 DynamicResource はディクショナリ キーへのリンクを保持します。 したがって、キーに関連付けられているディクショナリ エントリが置き換えられると、変更がビジュアル要素に適用されます。 これにより、ランタイム スタイルの変更をアプリケーションで行えます。

次のコード例は、XAML ページの 動的スタイル を示しています。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Styles.DynamicStylesPage" Title="Dynamic" IconImageSource="xaml.png">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Style x:Key="baseStyle" TargetType="View">
              ...
            </Style>
            <Style x:Key="blueSearchBarStyle"
                   TargetType="SearchBar"
                   BasedOn="{StaticResource baseStyle}">
              ...
            </Style>
            <Style x:Key="greenSearchBarStyle"
                   TargetType="SearchBar">
              ...
            </Style>
            ...
        </ResourceDictionary>
    </ContentPage.Resources>
    <ContentPage.Content>
        <StackLayout Padding="0,20,0,0">
            <SearchBar Placeholder="These SearchBar controls"
                       Style="{DynamicResource searchBarStyle}" />
            ...
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

インスタンスはSearchBarマークアップ拡張機能をDynamicResource使用して、 という名前searchBarStyleStyle を参照します。これは XAML で定義されていません。 ただし、インスタンスのStyleSearchBarプロパティは を使用してDynamicResource設定されるため、ディクショナリ キーが見つからない場合、例外はスローされません。

代わりに、分離コード ファイルでは、次のコード例に示すように、コンストラクターは キー searchBarStyleを使用してエントリを作成ResourceDictionaryします。

public partial class DynamicStylesPage : ContentPage
{
    bool originalStyle = true;

    public DynamicStylesPage ()
    {
        InitializeComponent ();
        Resources ["searchBarStyle"] = Resources ["blueSearchBarStyle"];
    }

    void OnButtonClicked (object sender, EventArgs e)
    {
        if (originalStyle) {
            Resources ["searchBarStyle"] = Resources ["greenSearchBarStyle"];
            originalStyle = false;
        } else {
            Resources ["searchBarStyle"] = Resources ["blueSearchBarStyle"];
            originalStyle = true;
        }
    }
}

イベント ハンドラーがOnButtonClicked実行されると、 searchBarStyle と を切り替えますgreenSearchBarStyleblueSearchBarStyle。 この結果、次のスクリーンショットに示すような外観が表示されます。

青の動的スタイルの例緑の動的スタイルの例

次のコード例は、C# の同等のページを示しています。

public class DynamicStylesPageCS : ContentPage
{
    bool originalStyle = true;

    public DynamicStylesPageCS ()
    {
        ...
        var baseStyle = new Style (typeof(View)) {
            ...
        };
        var blueSearchBarStyle = new Style (typeof(SearchBar)) {
            ...
        };
        var greenSearchBarStyle = new Style (typeof(SearchBar)) {
            ...
        };
        ...
        var searchBar1 = new SearchBar { Placeholder = "These SearchBar controls" };
        searchBar1.SetDynamicResource (VisualElement.StyleProperty, "searchBarStyle");
        ...
        Resources = new ResourceDictionary ();
        Resources.Add ("blueSearchBarStyle", blueSearchBarStyle);
        Resources.Add ("greenSearchBarStyle", greenSearchBarStyle);
        Resources ["searchBarStyle"] = Resources ["blueSearchBarStyle"];

        Content = new StackLayout {
            Children = { searchBar1, searchBar2, searchBar3, searchBar4,    button    }
        };
    }
    ...
}

C# では、インスタンスは SearchBar メソッドを SetDynamicResource 使用して を参照 searchBarStyleします。 OnButtonClickedイベント ハンドラー コードは XAML の例と同じであり、実行時に searchBarStylegreenSearchBarStyleblueSearchBarStyle切り替えます。

動的スタイルの継承

動的スタイルからスタイルを派生するには、 プロパティを Style.BasedOn 使用します。 代わりに、 クラスに Style プロパティが BaseResourceKey 含まれています。このプロパティは、値が動的に変更される可能性があるディクショナリ キーに設定できます。

次のコード例は、XAML ページでの 動的 スタイルの継承を示しています。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Styles.DynamicStylesInheritancePage" Title="Dynamic Inheritance" IconImageSource="xaml.png">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Style x:Key="baseStyle" TargetType="View">
              ...
            </Style>
            <Style x:Key="blueSearchBarStyle" TargetType="SearchBar" BasedOn="{StaticResource baseStyle}">
              ...
            </Style>
            <Style x:Key="greenSearchBarStyle" TargetType="SearchBar">
              ...
            </Style>
            <Style x:Key="tealSearchBarStyle" TargetType="SearchBar" BaseResourceKey="searchBarStyle">
              ...
            </Style>
            ...
        </ResourceDictionary>
    </ContentPage.Resources>
    <ContentPage.Content>
        <StackLayout Padding="0,20,0,0">
            <SearchBar Text="These SearchBar controls" Style="{StaticResource tealSearchBarStyle}" />
            ...
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

インスタンスはSearchBar、マークアップ拡張機能をStaticResource使用して、 という名前tealSearchBarStyleの をStyle参照します。 これにより Style 、いくつかの追加のプロパティが設定され、 プロパティを BaseResourceKey 使用して を参照します searchBarStyle。 マークアップ拡張はDynamicResource、派生元を除いてStyle変更されないため、必須tealSearchBarStyleではありません。 したがって、 は へのリンクをsearchBarStyle保持し、tealSearchBarStyle基本スタイルが変更されると変更されます。

分離コード ファイルでは、コンストラクターは、動的スタイルを ResourceDictionary 示した前の例に従って、 キー searchBarStyleを使用してエントリを作成します。 イベント ハンドラーがOnButtonClicked実行されると、 searchBarStyle と を切り替えますgreenSearchBarStyleblueSearchBarStyle。 この結果、次のスクリーンショットに示すような外観が表示されます。

青の動的スタイルの継承の例緑の動的スタイルの継承の例

次のコード例は、C# の同等のページを示しています。

public class DynamicStylesInheritancePageCS : ContentPage
{
    bool originalStyle = true;

    public DynamicStylesInheritancePageCS ()
    {
        ...
        var baseStyle = new Style (typeof(View)) {
            ...
        };
        var blueSearchBarStyle = new Style (typeof(SearchBar)) {
            ...
        };
        var greenSearchBarStyle = new Style (typeof(SearchBar)) {
            ...
        };
        var tealSearchBarStyle = new Style (typeof(SearchBar)) {
            BaseResourceKey = "searchBarStyle",
            ...
        };
        ...
        Resources = new ResourceDictionary ();
        Resources.Add ("blueSearchBarStyle", blueSearchBarStyle);
        Resources.Add ("greenSearchBarStyle", greenSearchBarStyle);
        Resources ["searchBarStyle"] = Resources ["blueSearchBarStyle"];

        Content = new StackLayout {
            Children = {
                new SearchBar { Text = "These SearchBar controls", Style = tealSearchBarStyle },
                ...
            }
        };
    }
    ...
}

tealSearchBarStyleは、インスタンスの SearchBar プロパティにStyle直接割り当てられます。 これにより Style 、いくつかの追加のプロパティが設定され、 プロパティを BaseResourceKey 使用して を参照 searchBarStyleします。 メソッドはSetDynamicResource、派生元を除いてStyle変更されないためtealSearchBarStyle、ここでは必要ありません。 したがって、 は へのリンクをsearchBarStyle保持し、tealSearchBarStyle基本スタイルが変更されると変更されます。

他の Xamarin ビデオは、Channel 9 および YouTube でご覧いただけます。