如何在WPF包装面板内上下滑动子项目
本文关键字:上下 子项目 WPF 包装 | 更新日期: 2023-09-27 18:19:13
大家好!
<标题> 的背景首先,我是WPF/Silverlight/XAML的绝对新手。
我有一个在运行时添加一堆图像缩略图的wrappanel。
当填充换行面板时,它水平运行缩略图,然后在下一行重复换行,以便在加载所有缩略图后,我在屏幕下方有几个视图。
在我的应用程序中,滚动条看起来不稳定,所以我想添加一个"up"answers";down"
<标题>当点击向上或向下按钮时,我如何向上或向下滑动wrappanel的内容/子元素?理想情况下,我想加入一个很好的舒缓效果,这样过渡一开始很快,然后慢慢停止。
多谢!
马特标题>标题>这里有两种方法,一种更像wpf,另一种可能更容易理解。
方法1。
使用ScrollViewer
并根据需要重新设置样式。类似wpf的方法-你需要滚动,所以使用ScrollViewer
,需要自定义外观或布局-重新定义其模板。
<ScrollViewer>
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<ScrollBar Grid.Row="0"
x:Name="PART_VerticalScrollBar"
Width="{TemplateBinding ActualWidth}"
Orientation="Vertical">
<ScrollBar.Template>
<ControlTemplate TargetType="{x:Type ScrollBar}">
<StackPanel Orientation="Horizontal">
<RepeatButton Content="Up"
Margin="2"
Command="ScrollBar.LineUpCommand"/>
<RepeatButton Content="Down"
Margin="2"
Command="ScrollBar.LineDownCommand"/>
</StackPanel>
</ControlTemplate>
</ScrollBar.Template>
</ScrollBar>
<ScrollContentPresenter Grid.Row="1"
x:Name="PART_ScrollContentPresenter" />
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
<WrapPanel x:Name="MyContent">
<!-- your data items are here -->
</WrapPanel>
</ScrollViewer>
方法2。
更直接的解决方案-编写一个滚动内容的方法,并从按钮单击事件处理程序调用它(或将其包装在iccommand中)。你可以使用Storyboard
应用动画效果平滑滚动。
使用以下简单的布局(它不包括向上/向下按钮-您可以随意放置它们,这里没有什么特别的):
<Canvas>
<WrapPanel x:Name="MyContent"
Width="{Binding ActualWidth,
RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}">
</WrapPanel>
</Canvas>
使用Canvas
代替ScrollContentPresenter
,因为Canvas.Top
属性可以动画化。
以及以下滚动内容的方法:
static void AnimateScroll(UIElement element, double amount, TimeSpan duration)
{
var sb = new Storyboard();
var position = Canvas.GetTop(element);
if(double.IsNaN(position)) position = 0;
var animation =
new DoubleAnimation
{
// fine-tune animation here
From = position,
To = position + amount,
Duration = new Duration(duration),
};
Storyboard.SetTarget(animation, element);
Storyboard.SetTargetProperty(animation, new PropertyPath(Canvas.TopProperty));
sb.Children.Add(animation);
sb.Begin();
}
方法使用:
// scroll down 30 units animating for 100ms
AnimateScroll(MyContent, -30, new TimeSpan(0, 0, 0, 0, 100));