Как динамически добавлять новые визуальные состояния в шаблон пользовательского элемента управления в коде? - PullRequest
4 голосов
/ 06 марта 2011

Можно ли программно в коде добавить новый VisualState в шаблон CustomControl * VisualStateManager?
Например, я могу добавить в шаблон CustomControl этот XAML вручную во время разработки:

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

Но как я могу добавить новый VisualState во время выполнения?

Ответы [ 2 ]

1 голос
/ 23 апреля 2013

Вы должны создать саму группу, используя XAML, который я предлагаю, затем вам нужно найти VisualStateGroup, которую вы ищете следующим образом:

VisualStateGroup visualStateGroupLookingFor = null;
var visualStateGroups = (VisualStateManager.GetVisualStateGroups(LayoutRoot));
foreach (VisualStateGroup state in visualStateGroups) {
    if (state.Name == "VisualStateGroupMine") {
        visualStateGroupLookingFor = state;
        break;
        }
    }

Затем вам нужно создать новый VisualState и Storyboard для добавления, например:

var visualState = new VisualState();
var storyBoard = new Storyboard();

Теперь создайте анимацию:

var animation = new DoubleAnimation();
animation.To = 10.0;

и установите цель анимации:

//assuming this is instance of class ClassFoo
//and you want to animate it's Width
Storyboard.SetTarget(animation, this);
Storyboard.SetTargetProperty(animation, new PropertyPath(ClassFoo.WidthProperty));

Наконец добавьте анимацию (s) на вашей раскадровке дайте ему имя, добавьте его в группу визуальных состояний:

storyBoard.Children.Add(animation);
visualState.Storyboard = storyBoard;
visualState.Name = "CoolNameLikeWidthAnimation";
visualStateGroupLookingFor.States.Add(visualState);

Вот так, запустите его как обычно с помощью

VisualStateManager.GoToState(this, "CoolNameLikeWidthAnimation", true);
1 голос
/ 15 марта 2011

Я думаю, что это выполнимо, но отнюдь не просто ...

это должно работать:

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, вам сначала нужно получить группу из коллекции, но это обычная вещь «получить элемент из коллекции»

в основном:

  1. Получить элемент шаблона, содержащий visualStateManager
  2. используйте статический метод VisualStateManager.GetVisualStateGroups() для получения текущих visualStateGroups
  3. получить нужную группу из коллекции или создать новую и добавить ее в коллекцию
  4. добавить новое visualState в эту группу

надеюсь, это поможет.

...