通用应用程序的 VisualStateManager 中的设置器

Setters in VisualStateManager for Universal Applications

Setter 中为 VisualState 设置 子控件 的属性是很正常的,但是...是否有可能使Setter 在 ControlTemplate 的上下文中更改 "Templated Control" 的 属性?

示例:这不起作用:

<VisualState x:Name="VerticalDisplay">
    <VisualState.Setters>
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </VisualState.Setters>
</VisualState>

运行 它抛出异常并显示此消息:

"WinRT information: The property 'Target' is missing from a Setter."

什么目标?我没有名字可以参考"myself"!我想更改我自己的 ItemsPanel。

希望你明白我想做什么。

整个Style如下(WizardControl派生自ListViewBase):

<Style TargetType="local:WizardControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:WizardControl">
                <Border
                Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}">

                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="SizeModes">
                            <VisualStateGroup.States>
                                <VisualState x:Name="VerticalDisplay">
                                    <VisualState.Setters>
                                        <Setter Property="ItemsPanel">
                                            <Setter.Value>
                                                <ItemsPanelTemplate>
                                                    <StackPanel Orientation="Vertical" />
                                                </ItemsPanelTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </VisualState.Setters>
                                </VisualState>
                                <VisualState x:Name="HorizontalDisplay">
                                    <VisualState.Setters>
                                        <Setter Property="ItemsPanel">
                                            <Setter.Value>
                                                <ItemsPanelTemplate>
                                                    <StackPanel Orientation="Horizontal" />
                                                </ItemsPanelTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </VisualState.Setters>
                                </VisualState>
                            </VisualStateGroup.States>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>

                    <Border x:Name="Root">
                        <ItemsPresenter />
                    </Border>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您可以使用 UserControl ..创建自定义用户控件并将其作为您的模板..然后您可以随心所欲地使用视觉状态:) .

我已经做了一个解决方法,使 托管 WizardControl 的 WizardControlHost 吱吱作响,绑定所有必需的属性(如 ItemsSource)并使用 Visual States 与 ItemsPanel 一起玩。

你可以在这里看到: https://github.com/SuperJMN/WizardControl-UWP/blob/master/Wizard/Themes/Generic.xaml#L164

我确定无法使用 VisualState Setters 修改模板化控件本身的属性。