当ContentView是ContentPage的孩子时,如何定义/覆盖Style的样式

时间:2016-08-02 11:21:58

标签: xamarin xamarin.android xamarin.forms

我的内容视图如下

        <?xml version="1.0" encoding="utf-8" ?>
        <ContentView xmlns="http://xamarin.com/schemas/2014/forms"
                     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                     xmlns:convertors="clr-namespace:myApp.Convertors;assembly=myApp"   
                     x:Class="myApp.cwPart">

          <ContentView.Content>
            <StackLayout Orientation="Horizontal"
                         BackgroundColor="White">
              <RelativeLayout Style="{StaticResource myStyle}"   
                              HorizontalOptions="Start"
                              VerticalOptions="Center">

我在多个ContentView内引用此ContentPage,如下所示。每个ContentPage都应设置不同的BackgroundColorHeightWidth。这就是为什么我认为该样式应该在ContentPage中定义,但是它会抛出错误,因为它无法识别。我怎样才能做到这一点?

PS,有趣的是我使用Gorilla播放器来实现这样的改变而且Gorilla播放器没有返回任何错误:)

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:convertors="clr-namespace:myApp.Convertors;assembly=myApp"
             xmlns:c="clr-namespace:myApp;assembly=myApp"
             x:Class="myApp.AppLogsPage"
             Title="{Binding AppName}" 
             x:Name="AppLogsPage">

  <ContentPage.Resources>

    <ResourceDictionary>

      <Style x:Key="myStyle" TargetType="RelativeLayout">
        <Setter Property="HeightRequest" Value="148"/>
        <Setter Property="WidthRequest" Value="80"/>
        <Setter Property="BackgroundColor" Value="White"/>
      </Style>
    </ResourceDictionary>

  </ContentPage.Resources>

    <ContentPage.Content>
      <StackLayout x:Name="MainHolder">
        <c:cwPart   />
       ...

如果我按如下所示定义ContentView资源,它可以正常工作,但我无法覆盖ContentView中定义的样式

            <?xml version="1.0" encoding="utf-8" ?>
            <ContentView xmlns="http://xamarin.com/schemas/2014/forms"
                         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                         xmlns:convertors="clr-namespace:myApp.Convertors;assembly=myApp"   
                         x:Class="myApp.cwPart">

            <ContentView.Resources>

    <ResourceDictionary>

      <Style x:Key="myStyle" TargetType="RelativeLayout">
        <Setter Property="HeightRequest" Value="148"/>
        <Setter Property="WidthRequest" Value="80"/>
        <Setter Property="BackgroundColor" Value="White"/>
      </Style>
    </ResourceDictionary>

  </ContentView.Resources>

              <ContentView.Content>
                <StackLayout Orientation="Horizontal"  BackgroundColor="White">
                  <RelativeLayout  Style="{StaticResource myStyle}"   
       HorizontalOptions="Start" VerticalOptions="Center" >

2 个答案:

答案 0 :(得分:1)

我会在你的方法中改变很多问题,但让我们保持简单。首先,我将使用带有控件模板的contentview作为;

在App.xaml;

<ControlTemplate x:Key="MyControlTemplate">
    <StackLayout Orientation="Horizontal"  BackgroundColor="White">
                  <RelativeLayout HorizontalOptions="Start" VerticalOptions="Center" />
</StackLayout>
  </ControlTemplate>

然后在你的page.xaml

<ContentView ControlTemplate={StaticResource MyControlTemplate}/>

如果要为每个页面设置单独的样式,则可以为每个页面创建一个控件模板。

答案 1 :(得分:0)

创建类似用户控件的WPF;

在App.xaml;

<ControlTemplate x:Key="MyControlTemplate">
    <StackLayout Orientation="Horizontal"  BackgroundColor="White">
                  <RelativeLayout HorizontalOptions="Start" VerticalOptions="Center" />
</StackLayout>
  </ControlTemplate>

在同一个项目中

public class CustomView: ContentView
{
   public CustomView()
   {
      ControlTemplate = (ControlTemplate)Application.Current.Resources.FirstOrDefault(x => x.Key == "MyControlTemplate").Value;
   }
}

然后您可以在任何xaml页面中使用CustomView控件/视图。不要忘记在使用xaml页面时添加CustomView的xaml名称空间。