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打开时更改它的颜色.这真的不应该是这么复杂.
您不需要为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中,你可以随意命名视觉状态(因为你最终会在代码中调用切换到那个视觉状态),内置控件,你的视觉状态必须准确命名控件所期望的.