如何在代码中动态地向自定义控件模板添加新的视觉状态?

rem*_*rem 5 c# silverlight wpf custom-controls visualstatemanager

是否可以在代码中以编程方式将新添加VisualStateCustomControl TemplateVisualStateManager
例如,我可以在设计时手动将此 XAML 添加到 CustomControl 模板:

<VisualState x:Name="First">
   <Storyboard>
      <ColorAnimation Duration="0:0:0"
                      Storyboard.TargetName="SBorder"
                      Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" To="Red" />
    </Storyboard>
</VisualState>
Run Code Online (Sandbox Code Playgroud)

但是我怎么能VisualState在运行时添加一个新的呢?

Dav*_*vid 2

我认为这是可行的,但绝不是容易的......

这应该有效:

Grid grid = this.Template.FindName("RootElement", this) as Grid;
(VisualStateManager.GetVisualStateGroups(grid)).Add(new VisualStateGroup() { /* the code for your visualstategroup here */ });
Run Code Online (Sandbox Code Playgroud)

(您需要根据模板根元素名称的类型以及设置视觉状态管理器的位置进行调整,但总而言之,这都是可行的。

另外,这添加了一个新的 VisualStateGroup,而不仅仅是一个 VisualState。如果要将 VisualState 添加到现有的 VisualStateGroup,则必须首先从集合中获取该组,但这是常见的“从集合中获取元素”内容

基本上:

  1. 获取包含 VisualStateManager 的模板元素
  2. 使用VisualStateManager.GetVisualStateGroups()静态方法获取当前的visualStateGroups
  3. 从集合中获取所需的组或创建一个新组并将其添加到集合中
  4. 在此组中添加一个新的视觉状态

希望这可以帮助。