【问题标题】:Explaining how to use VisualStateManager for a beginner为初学者解释如何使用 VisualStateManager
【发布时间】:2014-07-02 16:21:11
【问题描述】:

我对 Xaml/WPF 知之甚少。我正在尝试在 Windows 8 Metro 应用程序中为 Button 设计一个自定义 Style,它具有洋红色背景,按下时具有蓝色背景。我知道我需要使用 VisualStateManager,但我可以'在网上找不到任何对对该主题知之甚少的人有意义的东西。有很多假设的知识。到目前为止,这是我所得到的:

<Style x:Name="test" TargetType="Button">
        <Setter Property="Background" Value="Magenta"/>
        <Setter Property="Content" Value="Test style" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid>                          
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <turn the background blue>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

此代码可能非常错误,但正如我所说,我一直在尝试将我不理解的信息修补在一起以创建结果。

感谢您的宝贵时间

【问题讨论】:

  • 我从研究所有控件的默认样式模板开始。对于此示例,我建议采用默认的 Button 控件样式模板并根据您的目的对其进行编辑,而不是在最初几次尝试从头开始。正如 John 指出的那样,Blend 非常适合这类工作。

标签: wpf xaml windows-8 microsoft-metro


【解决方案1】:

即使是初学者,也不必费心尝试手写。 WPF(触发器)的原始机制很容易手动编写,但在较新的 XAML 平台上用作替代的 VSM 更加冗长,并且专门设计用于设计工具。

为了省去很多麻烦,只需在 Blend 中进行编辑,然后您可以查看它生成的 XAML,如果您想了解更多细节以在将来手动编辑。 Blend 体验非常简单 - 在“状态”面板中选择要编辑的状态,您将看到它的预览。您在选择该州时所做的任何更改都将应用为该州的情节提要。

【讨论】:

    【解决方案2】:

    我相信这里有很多人,花时间写解释您如何创建视觉状态以及它们的用途。我仍然会花一点时间来解释一些关于 VSM 的事情,我认为这些事情在文档中没有提到,但很清楚:

    您已经知道可以在控件的不同图形表示之间进行更改。这些状态在一个范围内是排他的 (VisualStateGroup)。含义 您可以定义具有三种状态的组 f.e.常规、按下和鼠标悬停。在给定时间只能应用组中的一个状态,但您可以将这些状态与其他组结合使用,例如可写或只读状态。

    它们是如何正确使用的:不查看特殊情况,您通常有一个方法 UpdateStates(bool useTransitions) 在您的控制范围内,其中包含几个到多个 if 情况。你检查你的内部控制状态像

    if (this.IsReadOnly) -> VisualStateManager.GoToState("ReadOnlyState",...
    

    UpdateStates 方法会在您更改时被调用...以及状态。这意味着您将拥有 DependencyProperties 和每个(相关的)DPChangeHandler(在注册调用时)。在 ChangeHandler 内部(以及其他需要的地方),您只需调用 UpdateStates 方法并让您的控件决定激活哪个状态。

    这至少是 MS 在其控件中的操作方式。

    希望对您有所帮助。 :)

    【讨论】:

    • 感谢旁注
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多