页面转换
本文关键字:转换 | 更新日期: 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;
}
}
要实现这一点,请执行以下操作:
- 保留对当前和以前UserControls的全局引用
- 正常过渡,但将已完成的活动发布到DoubleAnimation
- 使当前UserControl可见,并将ZIndex设置为高于上一个UserControl
- 使上一个UserControl访问并设置ZIndex情人而不是当前UserControl
- 启动动画
- 将Visual Brush设置为上一个UserControl
- 从当前UserControl中删除效果
- 现在动画完成时
- 将当前UserControl的ZIndex设置为上一个UserControl的设置
- 将上一个UserControl设置为可见
- 将上一个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;
}
希望这能帮到你。如果你有任何问题,请告诉我。