页面转换

本文关键字:转换 | 更新日期: 2023-09-27 18:20:16

我目前在使用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. 保留对当前和以前UserControls的全局引用
  2. 正常过渡,但将已完成的活动发布到DoubleAnimation
  3. 使当前UserControl可见,并将ZIndex设置为高于上一个UserControl
  4. 使上一个UserControl访问并设置ZIndex情人而不是当前UserControl
  5. 启动动画
  6. 将Visual Brush设置为上一个UserControl
  7. 从当前UserControl中删除效果
  8. 现在动画完成时
  9. 将当前UserControl的ZIndex设置为上一个UserControl的设置
  10. 将上一个UserControl设置为可见
  11. 将上一个UserControl设置为当前UserControl

这是MY此转换库的修改版本,因此您可能需要根据需要对其进行调整

Globals

    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;
    }

希望这能帮到你。如果你有任何问题,请告诉我。