Wpf 向初学者解释如何使用VisualStateManager

Wpf 向初学者解释如何使用VisualStateManager,wpf,xaml,windows-8,microsoft-metro,Wpf,Xaml,Windows 8,Microsoft Metro,我知道一些Xaml/WPF。我正试图在Windows 8 metro应用程序中为一个背景为洋红色、按下时背景为蓝色的按钮设计一个自定义的样式。我知道我需要使用VisualStateManager,但我在网上找不到任何对该主题知之甚少的人有意义的东西。有很多假定的知识。以下是到目前为止我得到的信息: <Style x:Name="test" TargetType="Button"> <Setter Property="Background" Value="Mage

我知道一些Xaml/WPF。我正试图在Windows 8 metro应用程序中为一个背景为洋红色、按下时背景为蓝色的按钮设计一个自定义的
样式
。我知道我需要使用
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>

这段代码可能是非常错误的,但正如我所说的,我一直在尝试将一些我不理解的信息拼接在一起,以创建一个结果


感谢您抽出时间

我相信这里会有很多人花时间来解释您是如何创建视觉状态的,以及它们的用途。尽管如此,我还是会花一点时间解释一些关于VSM的事情,我相信这些文件中没有提到,但我很清楚:

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

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

if (this.IsReadOnly) -> VisualStateManager.GoToState("ReadOnlyState",...
无论何时更改,都会调用UpdateStates方法。。。好的。这意味着您将拥有DependencyProperties,并且对于每个(相关的)DPChangeHandler(在寄存器调用时)。在ChangeHandler内部(以及其他需要的地方),您只需调用UpdateStates方法并让您的控件决定激活哪个状态

这至少是微软在其控制范围内的做法


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

作为一个初学者,甚至不用费心尝试手写。WPF(触发器)最初的机制非常简单,可以手工编写,但在较新的XAML平台上用作替代机制的VSM要详细得多,并且专门设计用于设计工具


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

感谢SideNote,我刚开始学习所有控件的默认样式模板。对于这个例子,我建议使用一个默认的按钮控件样式模板,并根据您的需要对其进行编辑,而不是在最初几次尝试从头开始。正如John指出的,Blend对于这类工作非常方便。