Как я могу поделиться VisualStateManager между двумя (или более) XAML файлами? - PullRequest
3 голосов
/ 06 декабря 2010

Мы пишем приложение Silverlight на основе Prism, и у нас есть целая куча страниц в отдельных модулях.

Переход между страницами обрабатывается с помощью событий навигации, и в каждом модуле реализованы следующие методычтобы показать страницу при переходе и скрыть ее при переходе от:

public void Show()
{
    VisualStateManager.GoToState(this, "ShowState", true);
}

public void Hide()
{
    VisualStateManager.GoToState(this, "HideState", true);
}

В настоящий момент «ShowState» и «HideState» определены в файле XAML каждого модуля, поэтому дублируются слишком много раз.

<Grid x:Name="LayoutRoot">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="VisualStates">
            <VisualState x:Name="ShowState">
                ...
            </VisualState>
            <VisualState x:Name="HideState">
                ...
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

Где ... представляет Storyboard для каждого перехода.

Я только что заметил ошибку в определениях Storyboard, и в данный момент мне придетсяповторить исправление во всех файлах.Было бы лучше, если бы в каждом файле было только одно определение Storyboard, на которое можно ссылаться.

Я искал все утро правильный синтаксис, но мне не повезло.

Как я могу поделиться этим VisualStateManager между всеми нашими файлами XAML?

1 Ответ

2 голосов
/ 06 декабря 2010
<Storyboard x:Key="ShowStoryboard">
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="glow" Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

<VisualState x:Name="ShowState">
    <BeginStoryboard Storyboard="{StaticResource ShowStoryboard}"/>
</VisualState>

Ссылка на раскадровку в XAML может быть выполнена, как показано выше. Самая верхняя часть - это раскадровка, хранящаяся где-то как ресурс. После этого вы сможете использовать ссылку BeginStoryboard в VisualState.

РЕДАКТИРОВАТЬ: Вышеупомянутое представляется возможным в WPF, но это невозможно в SL. На данный момент не представляется возможным повторно использовать Storyboard или VisualState в SL. Вы все еще должны быть в состоянии достичь того, что вы пытаетесь сделать, инкапсулируя поведение VisualStateManager в стиле, применяемом к пользовательскому элементу управления. Это даст вам единственную точку отказа, которую вы ищете.

...