Я столкнулся с подобной проблемой при разработке UserControl для WPF в Expression Blend (Примечание: если вы разрабатываете пользовательский элемент управления вместо этого, см. Мой следующий раздел). В этом UserControl у меня был дочерний элемент, который я хотел добавить и создать как наложение. Как и в вашей ситуации, в моем рабочем процессе имело смысл сначала спроектировать оверлейный элемент в его «полностью выросшем и видимом» состоянии, а затем уменьшить его и установить непрозрачность для «скрытого» состояния. При этом наложение отображается в состоянии Base, но мне нужно, чтобы начальное состояние UserControl было скрытым. На данный момент у меня было три основных соответствующих состояния: Базовое, «Скрытое» и «Видимое» (последние два являются частью группы состояний).
Вот как я решил проблему с начальным состоянием . Сначала я применил GoToStateAction к корневому элементу (к UserControl), который вызывается событием Loaded. Он говорит UserControl перейти прямо в состояние «Hidden»:
<i:Interaction.Triggers>
<i:EventTrigger>
<ei:GoToStateAction TargetObject="{Binding ElementName=userControl}" StateName="Hidden"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Во-вторых, я сделал соответствующие настройки перехода в группе состояний для наложения. Вероятно, есть несколько способов сделать это, но вот как я это сделал. Сначала я установил «Переход по умолчанию» на приятную настройку, скажем 0,4 секунды. Затем я установил время перехода от любого элемента (значок звезды в Blend) к этому «скрытому» состоянию равным 0 секундам (это позволяет вышеупомянутому GoToStateAction установить «начальное» состояние без того, чтобы пользователь знал что-либо другое). Затем я установил переход из состояния «Видимый» в состояние «Скрытый» в качестве соответствующего параметра (скажем, 0,4 секунды). В основном это охватывало все основания для переходов. Ключ заключался в том, чтобы убедиться, что «переход» из «любого элемента» в «скрытое» состояние был немедленным, а затем переопределить этот немедленный переход в случае перехода из «видимого» в «скрытое» состояние наложения.
Установка начального VisualState для Пользовательский элемент управления
Если вы разрабатываете пользовательский элемент управления (а не UserControl) и, таким образом, определяете свой VisualStateManager в шаблоне элемента управления, приведенный выше метод (инициирование изменения VisualState на основе события Loaded), вероятно, будет не работа. Это связано с тем, что визуальное дерево вашего элемента управления (определенное в файле стиля) применяется к вашему элементу управления непосредственно перед вызовом переопределения OnApplyTemplate()
, что обычно происходит после первого события Loaded
. Поэтому, если вы попытаетесь инициировать изменение VisualState в ответ на событие Loaded для пользовательского элемента управления, скорее всего, ничего не произойдет. Вместо этого вам нужно будет инициировать изменение состояния в коде OnApplyTemplate()
переопределения:
public class MyCustomControl : ContentControl
{
// ... other code ....
public MyCustomControl()
{
// avoid designer errors
if (DesignerProperties.GetIsInDesignMode(this))
return;
Loaded += new RoutedEventHandlerMyCustomControl_Loaded);
}
// This probably won't be called until AFTER OnApplyTemplate() gets
// called, so don't expect for your control to even have a visual tree
// yet when your control is first being contructed at runtime.
private void MyCustomControl_Loaded(object sender, RoutedEventArgs e)
{
}
public override void OnApplyTemplate()
{
// Avoid Visual Studio 2010 designer exceptions
// (Visual Studio can't handle the VisualState change at design-time)
if (DesignerProperties.GetIsInDesignMode(this))
return;
base.OnApplyTemplate();
// Now we know that the template has been applied, we have a visual tree,
// so state changes will work
VisualStateManager.GoToState(this, "MyInitialState", false);
}
}