Одним из способов решения этой проблемы является создание поведения, которое вы можете добавить к своему элементу управления, чтобы при загрузке перевести его в исходное визуальное состояние. Вот простой пример:
public class InitialVisualStateBehavior : Behavior<Control>
{
public static readonly DependencyProperty InitialStateProperty = DependencyProperty.Register(
"InitialState",
typeof(string),
typeof(InitialVisualStateBehavior),
null);
public string InitialState
{
get { return (string)GetValue(InitialStateProperty); }
set { SetValue(InitialStateProperty, value); }
}
protected override void OnAttached()
{
base.OnAttached();
if (this.AssociatedObject != null)
{
this.AssociatedObject.Loaded += new RoutedEventHandler(AssociatedObject_Loaded);
}
}
protected override void OnDetaching()
{
base.OnDetaching();
if (this.AssociatedObject != null)
{
this.AssociatedObject.Loaded -= AssociatedObject_Loaded;
}
}
private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
VisualStateManager.GoToState(this.AssociatedObject, this.InitialState, false);
}
}
Затем вы просто добавили бы это поведение на уровень UserControl в XAML:
<i:Interaction.Behaviors>
<myi:InitialVisualStateBehavior InitialState="SelectedVisualState" />
</i:Interaction.Behaviors>
Вы также можете легко изменить это, чтобы принимать разделенный запятыми список начальных состояний, которые вы могли бы затем разделить и перебрать, если вам нужно было поместить элемент управления в кучу различных взаимоисключающих состояний после загрузки.
Это также может быть преобразовано в действие TriggerAction, которое можно просто вызвать из события Loaded элемента управления, я не уверен, какой путь будет более чистым.