Переходы страницы - PullRequest
       1

Переходы страницы

1 голос
/ 15 января 2012

У меня проблема с переходами в данный момент с использованием http://www.codeproject.com/KB/WPF/WpfPageTransitions.aspx

Проблема в том, что если у меня есть кнопка на UserControl1 и когда кнопка нажата, она вызывает UserControl2 для перехода,но когда это происходит, фон UserControl2 виден, но другие элементы, такие как текст и кнопки, объединяются вместе с UserControl1.

. Как можно применить переход к UserControl1, чтобы только UserControl2 отображается?

Модифицированный код:

NewPage.xml

private void button1_Click(object sender, RoutedEventArgs e)
{
    Test test = new Test();
    pageTransitionControl.SetPreviousUserControl(newPage);
    pageTransitionControl.ShowPage(test);
}

PageTransition.xaml.cs

public partial class PageTransition : UserControl
{
    private UserControl currentUserControl;
    private UserControl previousUserControl;

    public static readonly DependencyProperty TransitionTypeProperty = DependencyProperty.Register("TransitionType",
        typeof(PageTransitionType),
        typeof(PageTransition), new PropertyMetadata(PageTransitionType.SlideAndFade));

    public PageTransitionType TransitionType
    {
        get
        {
            return (PageTransitionType)GetValue(TransitionTypeProperty);
        }
        set
        {
            SetValue(TransitionTypeProperty, value);
        }
    }

    public PageTransition()
    {
        InitializeComponent();
    }

    public void ShowPage(UserControl newPage)
    {
        currentUserControl = newPage;

        if (contentPresenter.Content != null)
        {
            UserControl oldPage = contentPresenter.Content as UserControl;
            oldPage.Loaded -= newPage_Loaded;
            UnloadPage(oldPage);
        }
        else
        {
            ShowNextPage();
        }
    }

    void ShowNextPage()
    {            
        currentUserControl.Loaded += newPage_Loaded;

        contentPresenter.Content = currentUserControl;

        if (currentUserControl != null)
        {
            currentUserControl.Visibility = Visibility.Visible;
            Panel.SetZIndex(currentUserControl, 100);
        }

        if (previousUserControl != null)
        {
            previousUserControl.Visibility = Visibility.Visible;
            Panel.SetZIndex(previousUserControl, 0);      
        }
    }

    void UnloadPage(UserControl page)
    {
        Storyboard hidePage = (Resources[string.Format("{0}Out", TransitionType.ToString())] as Storyboard).Clone();

        hidePage.Completed += hidePage_Completed;

        hidePage.Begin(contentPresenter);
    }

    void newPage_Loaded(object sender, RoutedEventArgs e)
    {
        Storyboard showNewPage = Resources[string.Format("{0}In", TransitionType.ToString())] as Storyboard;

        showNewPage.Begin(contentPresenter);

        currentUserControl = sender as UserControl;
    }

    void hidePage_Completed(object sender, EventArgs e)
    {
        contentPresenter.Content = null;

        ShowNextPage();
    }

    public void SetPreviousUserControl(UserControl userControl)
    {
        previousUserControl = userControl;
    }
}

1 Ответ

1 голос
/ 15 января 2012

Для этого сделайте следующее:

  1. Сохранить глобальную ссылку на текущий и предыдущий пользовательские элементы управления
  2. Получите ваш переход как обычно, но объявите завершенное событие в DoubleAnimation
  3. Сделать текущий UserControl видимым и установить ZIndex выше, чем предыдущий UserControl
  4. Сделайте так, чтобы предыдущий пользовательский контроль Visivle и установил любовника ZIndex, чем текущий пользовательский контроль
  5. Запустить анимацию
  6. Установить визуальную кисть для предыдущего пользовательского элемента управления
  7. Удалить эффект из Current UserControl
  8. Теперь, когда анимация закончена
  9. Установите ZIndex текущего UserControl на то, что вы установили Предыдущий UserControl
  10. Установите предыдущий UserControl на Visible
  11. Установить предыдущий UserControl на текущий UserControl

Это MY модифицированная версия этой библиотеки переходов, поэтому вам, возможно, придется настроить ее под свои нужды

Глобал

    private UserControl CurrentUserControl;
    private UserControl PreviousUserControl;
    private Random Random;

Методы

    private void TransitionEffectStarting(UserControl userControl)
    {
        CurrentUserControl = userControl;

        TransitionEffect[] effectGroup = Global.TransitionEffects[Random.Next(Global.TransitionEffects.Length)];
        TransitionEffect effect = effectGroup[Random.Next(effectGroup.Length)];

        RandomizedTransitionEffect randomEffect = effect as RandomizedTransitionEffect;
        if (randomEffect != null)
            randomEffect.RandomSeed = Random.NextDouble();

        DoubleAnimation animation = new DoubleAnimation(0.0, 1.0, new Duration(TimeSpan.FromSeconds(1.0)), FillBehavior.HoldEnd);
        animation.AccelerationRatio = 0.5;
        animation.DecelerationRatio = 0.5;
        animation.Completed += TransitionEffectCompleted;

        if (CurrentUserControl != null)
        {
            CurrentUserControl.Visibility = Visibility.Visible;
            Panel.SetZIndex(CurrentUserControl, 1);
        }

        if (PreviousUserControl != null)
        {
            PreviousUserControl.Visibility = Visibility.Visible;
            Panel.SetZIndex(PreviousUserControl, 0);
        }

        else
            Visibility = Visibility.Visible;

        effect.BeginAnimation(TransitionEffect.ProgressProperty, animation);

        if (PreviousUserControl != null)
        {
            VisualBrush visualBrush = new VisualBrush(PreviousUserControl);
            visualBrush.Viewbox = new Rect(0, 0, PreviousUserControl.ActualWidth, PreviousUserControl.ActualHeight);
            visualBrush.ViewboxUnits = BrushMappingMode.Absolute;
            effect.OldImage = visualBrush;
        }

        if (CurrentUserControl != null)
            CurrentUserControl.Effect = effect;
    }

    private void TransitionEffectCompleted(object sender, EventArgs e)
    {
        if (CurrentUserControl != null)
        {
            Panel.SetZIndex(CurrentUserControl, 0);
            CurrentUserControl.Effect = null;

            if (PreviousUserControl != null)
                PreviousUserControl.Visibility = Visibility.Hidden;
        }
        PreviousUserControl = CurrentUserControl;
    }

Надеюсь, это поможет вам. Дайте мне знать, если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...