C# WPF Frame 如何在页面上创建幻灯片效果?
C# WPF Frame how to create slide effect on pages?
我想在WPF,Frame控件上做一个页面滑动效果。
我们开始了。
首先,我放了一个框架和两个导航按钮:
<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 的卸载事件,但不起作用。
我想要的是,当page1开始退出时,page2应该马上上台,就像一列火车一样。
那么怎么做呢?谢谢
我已经使用每个 Page
单独的 Frame
完成了它。就像我们试图在网站中显示一个新网页一样,不使用一些技巧是不可能的。这里也是一样。对于滑动效果,StackPanel
和 Orientation=Horizontal
看起来还可以。
注意:在Frame样式中,我使用主Grid(Grd)来设置宽度,因为当我们将children(一个新的Frame)添加到StackPanel时,它的Width会增加。
您可以以此概念为基础。
<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>
code-behind
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);
}
我想在WPF,Frame控件上做一个页面滑动效果。 我们开始了。
首先,我放了一个框架和两个导航按钮:
<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 的卸载事件,但不起作用。
我想要的是,当page1开始退出时,page2应该马上上台,就像一列火车一样。
那么怎么做呢?谢谢
我已经使用每个 Page
单独的 Frame
完成了它。就像我们试图在网站中显示一个新网页一样,不使用一些技巧是不可能的。这里也是一样。对于滑动效果,StackPanel
和 Orientation=Horizontal
看起来还可以。
注意:在Frame样式中,我使用主Grid(Grd)来设置宽度,因为当我们将children(一个新的Frame)添加到StackPanel时,它的Width会增加。
您可以以此概念为基础。
<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>
code-behind
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);
}