在Uwp VisualState.Setters中使用StaticResource

时间:2018-02-14 10:57:31

标签: c# xaml uwp

这是我的代码

<VisualState x:Name="Focused">
  <VisualState.Setters>
    <Setter Property="Background" Value="{StaticResource LightButtonBackground}"/>
    <Setter Property="Foreground" Value="White" />
  </VisualState.Setters>
</VisualState>

编译器说XamlCompiler error WMC0615: Type 'StaticResource' used after '{' must be a Markup Extension. Error code 0x09ff.我在网络上找不到任何有用的信息。怎么了?

2 个答案:

答案 0 :(得分:2)

您在这里混合了Setter的两种用法。

Property属性只能在定义Style 时使用

    <Style TargetType="TextBlock" x:Key="TextBlockStyle">
        <Setter Property="Foreground" Value="Navy"/>
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="VerticalAlignment" Value="Bottom"/>
    </Style>

在样式定义中,目标控件类型已知(由Style.TargetType提供)。

VisualState.Setters列表中,您没有定义Style。您正在更改某些现有子控件的某些属性。在这种情况下,您需要使用Target属性让XAML运行时知道您要定位的元素和属性。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="NarrowState">
                <VisualState.Setters>
                    <Setter Target="myPanel.Orientation" Value="Vertical"/>
                    <Setter Target="myPanel.Width" Value="380"/>
                    <Setter Target="myTextBlock.MaxLines" Value="3"/>
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

    <StackPanel x:Name="myPanel" Orientation="Horizontal">
        <TextBlock x:Name="myTextBlock" MaxLines="5" Style="{ThemeResource BodyTextBlockStyle}"/>
    </StackPanel>
</Grid>

答案 1 :(得分:1)

正如@Vincent回答指出的那样,在视觉状态下定义它时,你没有正确使用setter,而是像定义样式资源时那样使用setter。 不过,我的回答是深入了解如何在一种风格上使用定义的StaticResource,分析这两种情况以及是否可能。

话虽如此,我不认为通过将样式设置为资源来定义样式的属性是可能的。

  • 如果您在资源上定义了多个属性,会发生什么?那么您如何能够将属性样式设置为包含多个样式属性的资源?
  • 如果您为背景定义了一个包含Color的资源,但是然后使用该资源将其设置为依赖项对象控件的前景,会发生什么?是否存在这种灵活性,因为您的目标是接受相同类型的属性?

您实际需要的是BasedOn属性,它允许继承样式。 唯一的缺点是从其他样式继承的Styles必须以相同类型的控件为目标,或者是从基本样式所针对的类型派生的控件。

在这里查看文档: https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/xaml-styles#use-based-on-styles

修改:

不幸的是,我不认为使用VisualState定义您的BasedOn样式以继承资源是可能的,因为我们被迫在其上指定每个setter定义。我们可能会遇到 XY问题吗? 在资源定义上,如果您想从样式继承,那么这将是一种方法,但实际上将它应用于视觉状态似乎是另一个完整的故事。