通用应用程序的 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 修改模板化控件本身的属性。
在 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 修改模板化控件本身的属性。