我解决此问题的一种方法是创建一个可以添加到控件的行为,以便在加载时将其置于初始视觉状态。这是一个简单的例子:
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);
}
}
然后,您只需将该行为添加到 XAML 中的 UserControl 级别:
<i:Interaction.Behaviors>
<myi:InitialVisualStateBehavior InitialState="SelectedVisualState" />
</i:Interaction.Behaviors>
您还可以轻松地对其进行修改以接受以逗号分隔的初始状态列表,然后如果您需要在加载后将控件置于一堆不同的互斥状态中,则可以拆分并循环遍历该列表。
这也可能被重构为一个 TriggerAction,您可以触发控件的 Loaded 事件,我不确定哪种方式会更干净。