为什么我的ContentView样式在整个页面中只能工作一次?

时间:2018-08-16 05:56:04

标签: xaml xamarin xamarin.forms

我在内容页面中定义了以下样式:

    <ContentPage.Resources>
        <ResourceDictionary>
            <Style TargetType="{x:Type ContentView}" x:Key="ColorScaleGordura">
                <Setter Property="Content">
                    <Setter.Value>
                        <StackLayout Orientation="Horizontal" Padding="15,0,15,0" HorizontalOptions="Center" Spacing="15" HeightRequest="30">
                            <Frame BackgroundColor="{StaticResource ColorScaleRed}" Style="{StaticResource NutrientColorFrameStyle}">
                                <Label Text="G" Style="{StaticResource NutrientInitialsStyle}"/>
                            </Frame>
                            <Frame BackgroundColor="{StaticResource ColorScaleDarkOrange}" Style="{StaticResource NutrientColorFrameStyle}">
                                <Label Text="G" Style="{StaticResource NutrientInitialsStyle}"/>
                            </Frame>
                            <Frame BackgroundColor="{StaticResource ColorScaleOrange}" Style="{StaticResource NutrientColorFrameStyle}">
                                <Label Text="G" Style="{StaticResource NutrientInitialsStyle}"/>
                            </Frame>
                            <Frame BackgroundColor="{StaticResource ColorScaleYellow}" Style="{StaticResource NutrientColorFrameStyle}">
                                <Label Text="G" Style="{StaticResource NutrientInitialsStyle}"/>
                            </Frame>
                            <Frame BackgroundColor="{StaticResource ColorScaleLightGreen}" Style="{StaticResource NutrientColorFrameStyle}">
                                <Label Text="G" Style="{StaticResource NutrientInitialsStyle}"/>
                            </Frame>
                            <Frame BackgroundColor="{StaticResource ColorScaleGreen}" Style="{StaticResource NutrientColorFrameStyle}">
                                <Label Text="G" Style="{StaticResource NutrientInitialsStyle}"/>
                            </Frame>
                            <Frame BackgroundColor="{StaticResource ColorScaleDarkGreen}" Style="{StaticResource NutrientColorFrameStyle}">
                                <Label Text="G" Style="{StaticResource NutrientInitialsStyle}"/>
                            </Frame>
                        </StackLayout>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

这是应该的样子:

enter image description here

我将其作为一种样式,因为我需要它在页面中重复很多次。我这样使用它:

<ContentView Style="{StaticResource ColorScaleGordura}"/>

它有效!但是只有一次。无论我将代码行粘贴在页面上的哪个位置,都只能使用其中的一行(通常是页面下方的另一行)。如果我做这样的事情:

<StackLayout>
    <Label Text="test1"/>
    <ContentView Style="{StaticResource ColorScaleGordura}"/>
    <StackLayout>
        <Label Text="test2"/>
        <ContentView Style="{StaticResource ColorScaleGordura}"/>
        <StackLayout>
            <Label Text="test3"/>
            <ContentView Style="{StaticResource ColorScaleGordura}"/>
        </StackLayout>
    </StackLayout>
</StackLayout>

这就是我得到的:

enter image description here

我想念什么?

1 个答案:

答案 0 :(得分:0)

问题是,您正在尝试将相同的Content添加到多个ContentView中。元素(以样式表示)不能添加到多个逻辑父级中。为避免这种情况,您可以将x:Shared="False"设置为Style

但是我相信x:Shared仅适用于WPF应用程序。我认为Xamarin.Forms没有其他替代方法。如果您打算重复StackLayout,则可以尝试将RepeaterViewDataTemplate一起使用以达到预期效果。

可以使用workaround来执行此操作,但是CreateContent()方法似乎不可用。不过,如果上述解决方案对您不起作用,您仍可以使其正常工作。