解释如何将VisualStateManager用于初学者

Ral*_*alt 2 wpf xaml microsoft-metro windows-8

我知道很少Xaml/WPF.我正在尝试Style在Windows 8 metro应用程序中设计一个Button具有洋红色背景的自定义,并且在按下时,具有蓝色背景.我知道我需要使用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>
Run Code Online (Sandbox Code Playgroud)

这段代码可能是非常错误的,但正如我所说,我一直试图修补一些我不理解的信息以创造结果.

感谢您的时间

Joh*_*wen 7

作为一个初学者,甚至都不想手工编写它.WPF(触发器)的原始机制非常简单,可以手工编写,但是在新的XAML平台上用作替代的VSM更加冗长,专门设计用于设计工具.

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


Gop*_*ope 5

我确信这里有很多人花时间写一篇解释如何创建视觉状态以及它们的用途。尽管如此,我还是会花一点时间来解释一些有关 VSM 的事情,我相信这些事情在文档中没有提及,但很容易了解:

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

如何正确使用它们:不考虑特殊情况,您通常可以UpdateStates(bool useTransitions)在控制范围内使用单个方法来保存几个到多个 if 情况。您检查您的内部控制状态,例如

if (this.IsReadOnly) -> VisualStateManager.GoToState("ReadOnlyState",...
Run Code Online (Sandbox Code Playgroud)

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

这至少是 MS 在其控件内的做法。

希望对你有一点帮助。:)