如何拥有照片查看器样式的页面
本文关键字:样式 照片 何拥有 拥有 | 更新日期: 2023-09-27 18:20:25
我不知道我的名字是否正确,但我有一个显示一排图片的应用程序。如果用户向左滑动,则会出现全屏显示的上一张图片,如果向右滑动,则显示全屏显示的下一张图片。两者的动作与在照片应用程序或PDF阅读器中查看图片完全相同。我以为我可以操纵全景控制来适应这个,但我无法在全屏显示图片,而且顶部有标题的位置。
我该怎么做?任何提示
注意:此stackerflow上的策略变得很烦人。有些人可以投票结束,或者说一些句子片段:你尝试了什么,或者你的代码在哪里。从基础上关闭这个问题,以获得良好的感觉。
这是关于要求导游有一种观看风格。。如果不知道如何执行,我应该显示什么代码?不管怎样,我找到了我的答案,没有必要这么做。
我会告诉你我做了什么,也许你会觉得足够了。我想要一个全屏图像查看器,让我滑动到下一个(或上一个)图像,但让它捕捉到图像,而不是正常滚动。
我使用了一个禁用内部scrollViewer的全屏ListBox(请参阅XAML),然后使用一些附加的依赖项属性来获取内部scroll查看器的水平(和垂直)偏移的属性(这样我就可以自己制作滚动动画)。我的实现要复杂得多,因为我也想缩放(然后平移)图像,但只转到下一个图像的部分并不难做到
免责声明:我已经从StackOverflow和其他网站上的几个来源获取了代码。我不记得我从哪里得到的了,但我并不是一个人想出这些主意的。如果我知道在哪里赊账,我会很乐意赊账的。
首先,创建一个名为ScrollViewerEx:的新类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace ImageViewer
{
public class ScrollViewerEx
{
public static double GetHOffset(ScrollViewer obj)
{
return (double)obj.GetValue(ScrollViewer.HorizontalOffsetProperty);
}
public static void SetHOffset(ScrollViewer obj, double value)
{
obj.SetValue(HOffsetProperty, value);
}
// Using a DependencyProperty as the backing store for HOffset. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HOffsetProperty =
DependencyProperty.RegisterAttached("HOffset", typeof(double), typeof(ScrollViewerEx), new PropertyMetadata(new PropertyChangedCallback(OnHOffsetChanged)));
private static void OnHOffsetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var scroll = sender as ScrollViewer;
scroll.ScrollToHorizontalOffset((double)e.NewValue);
}
public static double GetVOffset(ScrollViewer obj)
{
return (double)obj.GetValue(ScrollViewer.VerticalOffsetProperty);
}
public static void SetVOffset(ScrollViewer obj, double value)
{
obj.SetValue(VOffsetProperty, value);
}
// Using a DependencyProperty as the backing store for VOffset. This enables animation, styling, binding, etc...
public static readonly DependencyProperty VOffsetProperty =
DependencyProperty.RegisterAttached("VOffset", typeof(double), typeof(ScrollViewerEx), new PropertyMetadata(new PropertyChangedCallback(OnVOffsetChanged)));
private static void OnVOffsetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var scroll = sender as ScrollViewer;
scroll.ScrollToVerticalOffset((double)e.NewValue);
}
}
}
好的,假设你准备了一个列表框,如下所示。在我的案例中,Images属性是一个名为PictureModel的类,里面有一个ImageSource。我没有显示我的ItemTemplate,只是在里面放了一个Image,并将Source绑定到你的ImageSource。请注意ListBox下面的矩形。我把所有的触摸码都放在那里,因为当我使用缩放图像时,我的坐标系正在改变。使用矩形覆盖可以使我拥有所有触摸的标准屏幕坐标。你可能不需要这个。
<ListBox ItemsSource="{Binding Images}"
x:Name="listBox"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.ManipulationMode="Control"
Loaded="listBox_Loaded_1"
>
<ListBox.Resources>
<Storyboard x:Name="ScrollStoryboard">
<DoubleAnimation x:Name="AnimationH" Duration="0:0:0.5">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseInOut"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation x:Name="AnimationV" Duration="0:0:0.5">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseInOut"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</ListBox.Resources>
<ListBox.ItemContainerStyle>
<StaticResource ResourceKey="ListBoxItemPivotStyle"/>
</ListBox.ItemContainerStyle>
</ListBox>
<Rectangle Fill="Transparent"
x:Name="TouchRectangle"
ManipulationCompleted="Rectangle_ManipulationCompleted_1"
ManipulationDelta="Rectangle_ManipulationDelta_1"
ManipulationStarted="Rectangle_ManipulationStarted_1"/>
好的,另一个关键部分。请确保将THIS放入页面的构造函数中。这就是允许您为滚动查看器偏移量更改设置动画的原因。
Storyboard.SetTargetProperty(ScrollStoryboard.Children[0], new PropertyPath(ScrollViewerEx.HOffsetProperty));
Storyboard.SetTargetProperty(ScrollStoryboard.Children[1], new PropertyPath(ScrollViewerEx.VOffsetProperty));
在ListBox:中获取对滚动查看器的永久引用
private void listBox_Loaded_1(object sender, RoutedEventArgs e)
{
scrollviewer = GetVisualChild<ScrollViewer>(listBox);
}
最后,处理操纵事件。设置列表框滚动动画的关键是操纵完成事件。我没有使用垂直偏移,只使用水平偏移。变量vm。位置是沿着滚动视图计算的位置。horizontaloffset。基本上,如果你在第5张图像上,那么将屏幕宽度乘以4就可以得到水平偏移。
private void Rectangle_ManipulationCompleted_1(object sender, ManipulationCompletedEventArgs e)
{
if (e.FinalVelocities.LinearVelocity.X > 2000)
{
if (ScrollStoryboard.GetCurrentState() != ClockState.Stopped)
ScrollStoryboard.Stop(); // ensure storyboard stopped after previous run
AnimationH.SetValue(DoubleAnimation.FromProperty, scrollviewer.HorizontalOffset);
AnimationH.SetValue(DoubleAnimation.ToProperty, (double)vm.Position);
Storyboard.SetTarget(ScrollStoryboard, scrollviewer);
ScrollStoryboard.Begin();
}
}
我希望这能有所帮助。正如我所说,除了从ListBox中获得的内置UI虚拟化之外,我所做的完整实现还包括数据虚拟化。那个和缩放。它还没有完全准备好发布,但这会让你开始。