XAML样式仅应用于第一个矩形。如何让它适用于所有人?

时间:2012-09-21 08:35:05

标签: xaml windows-8 windows-runtime winrt-xaml

在Windows 8(WinRT)应用程序中,我创建自己的XAML样式以获得虚线矩形。在样式的setter中,我使用Property="StrokeDashArray" Value="1,4"。然后我创建了一堆矩形,然后将这些矩形的样式显式设置为我创建的这种样式。第一个矩形显示为带有虚线的边框 - 但其他两个则不显示。但是,如果除了Style={StaticResource myDottedStyle}之外,我还为每个矩形指定了StrokeDashArray,那么所有这些矩形都会正确地显示为虚线边框。

为什么虚线边框仅显示第一个矩形?如何创建一个应用于所有矩形的Style而不为每个矩形指定StrokeDashArray?

这是一个完整的代码示例。在Windows 8 RTM中,创建一个Blank XAML应用程序项目,并使用以下内容替换MainPage.xaml中的Grid:

<Page.Resources>
    <Style x:Key="myDottedStyle" TargetType="Rectangle">
        <Setter Property="Stroke" 
            Value="{StaticResource ApplicationForegroundThemeBrush}"/>
        <Setter Property="StrokeThickness" Value="2"/>
        <Setter Property="StrokeDashArray" Value="1,4"/>
    </Style>
</Page.Resources>

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Rectangle Style="{StaticResource myDottedStyle}" Width="40" 
        HorizontalAlignment="Left"/>
    <Rectangle Style="{StaticResource myDottedStyle}" Width="40" 
        HorizontalAlignment="Center"/>
    <Rectangle Style="{StaticResource myDottedStyle}" Width="40" 
        HorizontalAlignment="Right"/>
</Grid>

Here is a screenshot of the output of this

我发现了一个涉及DataTemplates here的相关问题,但我无法弄清楚如何将其转化为我的问题。

1 个答案:

答案 0 :(得分:2)

您可以通过不要求每个实例重新绘制矩形并替换ContentControl来优化一些事情,因为它们看起来相同但有细微差别。例如,像<; p>这样的东西

<Style x:Key="MyDottedStyle" TargetType="ContentControl">
    <!-- Add additional Setters Here -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ContentControl">
                <Rectangle Stroke="{StaticResource ApplicationForegroundThemeBrush}"
                       StrokeThickness="2"
                       StrokeDashArray="1,4"
                       Width="40" Height="40"
                       HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                       Margin="{TemplateBinding Margin}"/>                                          
            </ControlTemplate>
        </Setter.Value>
    </Setter>                      
</Style>

    <!-- And now actually place it on your view -->
<ContentControl Style="{StaticResource MyDottedStyle}" HorizontalAlignment="Center"/>

这样你不仅可以清理东西,因为你可以把你的Style模板打成一片,然后把它打成一个资源字典,以减少混乱,但也可以让它更有效率,因为你没有重新绘制你的每次需要时塑造。希望这可以帮助!干杯!