c# – 如何在代码中动态地将新的Visual States添加到自定义控件模板?

是否可以在代码中以编程方式将新的VisualState添加到CustomControl模板的VisualStateManager中?

例如,我可以在设计时手动将此XAML添加到CustomControl模板:

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

但是如何在运行时添加新的VisualState?

最佳答案 我认为这是可行的,但绝不容易……

这应该工作:

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

(您需要根据模板的根元素名称的类型以及设置visualstatemanager的位置进行调整,但总而言之,这可以起作用.

另外,这会添加一个新的visualStateGroup,而不仅仅是一个visualState.如果要将VisualState添加到现有的visualStateGroup,则必须首先从集合中获取组,但这是常见的“从集合中获取元素”的东西

基本上:

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

希望这可以帮助.

点赞