C# WPF Frame, как создать эффект слайда на страницах?
Я хочу сделать эффект слайда страницы на WPF, элемент управления Frame. вот так.
Прежде всего, я поставил рамку и 2 кнопки для навигации:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="25"/>
</Grid.ColumnDefinitions>
<Frame x:Name="frame" Source="page1.xaml" Grid.Column="1" />
<Button Grid.Column="0" Content="<" Click="GoPrevious"/>
<Button Grid.Column="2" Content=">" Click="GoNext"/>
</Grid>
Затем я создаю 3 страницы в разных цветах: Page1.xaml, Page2.xaml и Page3.xaml
Теперь, когда вы нажмете кнопку навигации, просто перейдете к URI:
frame.Navigate(new Uri("page2.xaml", UriKind.Relative));
Готово. Теперь я хочу, чтобы каждая страница скользила при навигации (это хотят все). Поэтому я планирую установить Loaded EventTrigger на каждой странице:
<Page.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard>
<ThicknessAnimation Duration="0:0:0.75" Storyboard.TargetProperty="Margin" From="500,0,-500,0" To="0" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="FrameworkElement.Unloaded">
<BeginStoryboard>
<Storyboard>
<ThicknessAnimation Duration="0:0:0.75" Storyboard.TargetProperty="Margin" From="0" To="-500,0,500,0" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Page.Triggers>
И это работает! Все идет хорошо, пока я не обнаружу, что страницы не являются непрерывными, то есть, когда вы переходите на страницу 2, страница 1 немедленно выгружается, чем начинается событие загрузки страницы 2. Я пытался установить событие выгрузки page1, но не работает.
я хочу, чтобы, когда страница 1 начинала выходить, страница 2 должна сразу выходить на сцену, как поезд один за другим.
Так как это сделать? Благодарю.
1 ответ
Я сделал это с помощью отдельного Frame
в Page
, Как будто мы пытаемся показать новую веб-страницу на веб-сайте, это невозможно без использования некоторых хитростей. То же самое и здесь. И для скользящего эффекта, StackPanel
с Orientation=Horizontal
выглядит хорошо.
Примечание. В стиле "Фрейм" я использовал основную сетку (Grd) для установки ширины, так как при добавлении дочерних элементов (нового фрейма) в StackPanel его ширина увеличивается.
Вы можете опираться на эту концепцию.
<Grid Background="#FF33CF2C" x:Name="Grd">
<StackPanel x:Name="StkPnl" Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="Frame">
<Setter Property="Margin" Value="0,50,0,0"/>
<Setter Property="Width" Value="{Binding ActualWidth, ElementName=Grd}"/>
<Setter Property="NavigationUIVisibility" Value="Hidden"/>
</Style>
</StackPanel.Resources>
<Frame x:Name="FramePage1" Source="/WpfNavigation;component/Sliding/Page1.xaml" />
</StackPanel>
<Button Content="Goto Page2" HorizontalAlignment="Left" Margin="114,18,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click">
<Button.Triggers>
<EventTrigger RoutedEvent="ButtonBase.Click">
<BeginStoryboard>
<Storyboard Storyboard.TargetName="FramePage1" Storyboard.TargetProperty="Margin">
<ThicknessAnimation To="-2000 , 50 , 0, 0" Duration="0:0:5"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</Grid>
фоновый код
private void Button_Click(object sender, RoutedEventArgs e)
{
Frame f = new Frame();
f.Source = new Uri("pack://application:,,,/Sliding/Page2.xaml", UriKind.Absolute);
StkPnl.Children.Add(f);
}