如何为 UWP 元素设置状态?
How to set state for UWP element?
我有一个按钮,当切换按钮打开时,其状态会根据某些条件发生变化,例如,更改颜色、大小,enabled/disabld。我的目标是封装状态,以便我们可以做这样的事情:
if (toggleButton.IsOn) btnName.state = State1;
else btnName.state = State2;
我们在哪里定义状态 1 和状态 2(也许在 XAML?)。
这可能与 UWP 相关吗?
您可以使用VisualStateManager
调用控件的特定状态。例如,如果你想手动让ToggleSwitch
进入它的On
状态,你可以写-
VisualStateManager.GoToState(MyToggleSwitch, "On", true);
但是不要这样做。因为这只是在视觉上设置状态,底层IsOn
属性 仍然是 False
.
实际上,通过将 IsOn
设置为 True
,将自动应用 On
状态。这是因为在 ToggleSwitch
的 default style 中的 ToggleStates
视觉状态组中,有一个 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
) 及其相应的状态,因此当其他人使用您的控件时,他们可以简单地更新它们并期望应用正确的状态。
我有一个按钮,当切换按钮打开时,其状态会根据某些条件发生变化,例如,更改颜色、大小,enabled/disabld。我的目标是封装状态,以便我们可以做这样的事情:
if (toggleButton.IsOn) btnName.state = State1;
else btnName.state = State2;
我们在哪里定义状态 1 和状态 2(也许在 XAML?)。
这可能与 UWP 相关吗?
您可以使用VisualStateManager
调用控件的特定状态。例如,如果你想手动让ToggleSwitch
进入它的On
状态,你可以写-
VisualStateManager.GoToState(MyToggleSwitch, "On", true);
但是不要这样做。因为这只是在视觉上设置状态,底层IsOn
属性 仍然是 False
.
实际上,通过将 IsOn
设置为 True
,将自动应用 On
状态。这是因为在 ToggleSwitch
的 default style 中的 ToggleStates
视觉状态组中,有一个 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
) 及其相应的状态,因此当其他人使用您的控件时,他们可以简单地更新它们并期望应用正确的状态。