在XAML中,VisualStateManager的正确XML命名空间是什么?

Che*_*eso 3 wpf xaml visualstatemanager

我正在尝试重新设置一些ToggleButtons.显然我不能简单地将背景设置为新颜色,因为有一个"控制模板"提供了ToggleButton的视觉行为.所以我需要做的是在XAML中为ToggleButton指定一个替换"ControlTemplate",它提供不同的视觉行为,超出简单的背景颜色.
Q1.它是否正确?


我想从ToggleButton的"默认"controltemplate开始,我从这里抓取,然后修改它.实际上这是Silverlight的默认ControlTemplate,我想,我没有使用Silverlight,我正在使用WPF.但是...... WPF的相应文档页面不包含默认controltemplate的规范.它提供了"a"ControlTemplate,这不是我想要的.
Q2.我不确定我使用Silverlight中的东西是否重要.可以?


在Silverlight示例中,应用于VisualStateManager的vsm的XML名称空间前缀.显然,xml命名空间是

  xmlns:vsm = "clr-namespace:System.Windows;assembly=System.Windows"  
Run Code Online (Sandbox Code Playgroud)

...但在其他地方我读到这个XML命名空间"不再是必需的".

这一切都非常令人困惑.

在Googlespace中,有一些名为"WPF工具包"的引用,我之前已经接触过 - 在WPF V4发布之前将它用于自动完成文本框.我猜测一些WPF工具包的东西被卷入WPF for .NET v4.0,这就是我不再需要指定WPF工具包的原因.
Q3.如果有人能证实这种理解,我会很感激.


好的,现在从ToggleButton的"默认"ControlTemplate开始,我的第一步是编译它,然后再进行任何更改.它没有编译,失败了

c:\ dev ...\ToggleButtonStyle1.xaml(23,14):错误MC3074:标识'VisualStateManager.VisualStateGroups'在XML命名空间中不存在' http://schemas.microsoft.com/winfx/2006/xaml/演讲 '.第23行位置14.

足够清楚.然后我查看了在XAML中指定VisualStateManager的文档.令人困惑的是,它指定了两个xml命名空间,其中一个是我实际使用的命名空间.

在此输入图像描述

Q4嗯,我应该使用哪些?其中一个,我DID使用,它没有用.文档完全不清楚指定TWO XML命名空间的含义.(关上他们的头!)

我在项目文件中引用了PresentationFramework.dll:

  <ItemGroup>
     ....
    <Reference Include="PresentationFramework" />
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

我这里没有使用Visual Studio; 我正在使用文本编辑器.我想了解它是如何工作的,而不是要推动的按钮.

感谢您提供的任何帮助.


只是一个评论 - 这似乎非常复杂.我想要做的就是在ToggleButton打开时更改它的颜色.这真的不应该是这么复杂.

Jor*_*Day 5

您不需要为VSM指定命名空间(http://schemas.microsoft.com/winfx/2006/xaml/presentation命名空间是默认的WPF命名空间,在大多数标准中声明为xmlns ="..." .xaml's) - 但您只能在视觉层次结构的某些部分使用它.

例如,当我在标准UserControl中使用VSM时,它看起来像这样:

<UserControl x:Class="Whatever"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid x:Name="LayoutRoot">
    <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="CommonStates">
        <VisualState x:Name="Disabled">
          <!-- Storyboards go here -->
        </VisualState>
      </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
  </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

将VSM xaml置于此级别将使您的故事板能够引用Grid中包含的任何元素.这与您正在使用的ControlTemplate中的工作方式相同.但有一点需要注意的是,在你自己的 UserControls中,你可以随意命名视觉状态(因为你最终会在代码中调用切换到那个视觉状态),内置控件,你的视觉状态必须准确命名控件所期望的.