我有一个按钮,其状态根据某些标准而变化。例如,当切换按钮打开时,更改颜色,大小,启用/禁用。我的目标是封装状态,以便我们可以这样做:
if (toggleButton.IsOn) btnName.state = State1;
else btnName.state = State2;
我们在哪里定义状态1和状态2(可能在XAML中?)。
这可能与UWP有关吗?
答案 0 :(得分:2)
您可以使用VisualStateManager
调用某个控件的某个状态。例如,如果您想手动让ToggleSwitch
进入On
状态,您可以写 -
VisualStateManager.GoToState(MyToggleSwitch, "On", true);
但请勿执行此操作。因为这只会将状态设置为可视,所以基础IsOn
属性仍为False
。
实际上,通过将IsOn
设置为True
,将自动应用On
状态。这是因为在ToggleStates
的{{3}}中的ToggleSwitch
视觉状态组内,有一个On
状态,其中有一堆Storyboard
,如下所示 -
<VisualState x:Name="On">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="KnobTranslateTransform"
Storyboard.TargetProperty="X"
To="24"
Duration="0" />
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchKnobBounds"
Storyboard.TargetProperty="Opacity">
<DiscreteObjectKeyFrame KeyTime="0" Value="1" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="OuterBorder"
Storyboard.TargetProperty="Opacity">
<DiscreteObjectKeyFrame KeyTime="0" Value="0" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchKnobOn"
Storyboard.TargetProperty="Opacity">
<DiscreteObjectKeyFrame KeyTime="0" Value="1" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchKnobOff"
Storyboard.TargetProperty="Opacity">
<DiscreteObjectKeyFrame KeyTime="0" Value="0" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
只要Storyboard
设置为IsOn
,这些True
就会开始。该触发逻辑封装在ToggleSwitch
的代码中。因此,当您想要为自定义控件定义自己的可视状态时,您需要手动挂接状态属性(例如IsChecked
,IsSelected
,IsOn
,IsEnabled
)具有相应的状态,因此当其他人使用您的控件时,他们可以简单地更新它们并期望应用正确的状态。