XamarinForms XAML:如何从ResourceDictionaries等其他XAML文件继承属性?

时间:2015-05-18 17:38:29

标签: c# xaml inheritance xamarin xamarin.forms

我正在使用资源字典,但是将它们从一个Xaml复制并粘贴到另一个Xaml以使它们全部更新变得乏味。我看到这样做的唯一方法是继承一个样式类,但我不喜欢在C#中声明属性的方式(我更喜欢XAML的更多可视化树语法)。有没有办法让一个XAML从另一个继承?或者像LoadXaml()这样的方法,我可以调用每个我创建的Xamarin.Forms.ContentPage来继承StylePage?

这是我的风格xaml页面:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Demo.StylePage">
    <!-- Shared Properties -->
    <ContentPage.Resources>
        <ResourceDictionary>
            <!-- TitleBar Styles -->
            <Style x:Key="TitleBarStyle" TargetType="StackLayout">
                <Setter Property="BackgroundColor" Value="#5db3d6"/>
                <Setter Property="Padding" Value="15,6"/>
                <Setter Property="HeightRequest" Value="44"/>
            </Style>

            <Style x:Key="TitleBarHeaderStyle" TargetType="Label">
                <Setter Property="TextColor" Value="White"/>
                <Setter Property="VerticalOptions" Value="CenterAndExpand"/>
<!--                <Setter Property="FontSize" Value="18"/>-->
                <Setter Property="HorizontalOptions" Value="FillAndExpand"/>
            </Style>

            <Style x:Key="EmptyFrameStyle" TargetType="Frame">
                <Setter Property="HasShadow" Value="false"></Setter>
                <Setter Property="BackgroundColor" Value="Transparent"></Setter>
                <Setter Property="Padding" Value="0,0"></Setter>
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>
</ContentPage>

如何从其他文件加载此资源字典?谢谢你的时间,谢尔盖。

3 个答案:

答案 0 :(得分:3)

ContentPages支持继承。您始终可以定义一个BasePage,在那里实现您的资源,然后让每个新的ContentPage继承它。虽然我从未使用继承xaml这样做,但我已经习惯在我的BasePage代码隐藏中共享分析,日志记录等(如下所示)。

我建议尝试一种类似的方法,只是在你的BasePage中实例化你的资源字典。

BaseFormPage:

public class BasePage : ContentPage
    {
        public BasePage () : base () { }

        protected override void OnAppearing ()
        {
            base.OnAppearing ();

            AnalyticsApi.LogPageView ();
            AnalyticsApi.LogEvent(Title + " Page Loaded");

        }
    }

ChildFormPage:

<?xml version="1.0" encoding="UTF-8"?>
<local:BasePage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:local="clr-namespace:MyApp;assembly=MyApp"
             x:Class="MyApp.LoginPage"
             Title="{x:Static local:Strings.SignIn}"
             BackgroundColor="{x:Static local:Colors.ThemeQuaternary}">
    <StackLayout>
        ...
    </StackLayout>
</local:BasePage>

答案 1 :(得分:1)

您可以使用XAML / cs组合替换App.cs,如图所示here

App.xaml中定义的资源将适用于您应用中加载的每个视图。

确保您的App.xaml文件具有“嵌入资源”的构建操作。或者,您可以从用户界面中将其添加为ContentView with XAML,然后将ContentView替换为Application

enter image description here

<强>的App.xaml

<Application
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="WorkingWithAppResources.App">
    <Application.Resources>
        <ResourceDictionary>
            <Style x:Key="labelStyle" TargetType="Label">
                <Setter Property="TextColor" Value="Green" />
            </Style>
        </ResourceDictionary>
    </Application.Resources>
</Application>

<强> App.xaml.cs

public partial class App : Application
{
    public App ()
    {
        InitializeComponent ();
        MainPage = YourContentPage(); // change as required
    }
}

答案 2 :(得分:0)

Xamarin.Forms中,您可以在每个VisualElement上声明资源。然后,您可以使用{StaticResource}{DynamicResource}

访问这些资源

所采用的解决方案规则大致如下:

  • 代表{StaticResource}
    • 在同一个VisualElement.Resources文件中查看此XAML或其任何一个
    • 然后查看Application.Current.Resources
  • 代表{DynamicResource}
    • 查看此VisualElement.Resources或其中的任何一个,即使是未在同一XAML文件中定义的内容,也不包括Application.Resources
    • 请注意{DynamicResources}支持稍后添加资源或更改父级

要回答您的问题,您确实可以在XAML中的基类中定义样式并使用XAML继承,或者将所有资源添加到Application类中。如果您的应用程序没有XAML文件,只需添加一个,然后从Application构造函数中调用InitializeComponents()