【发布时间】:2011-06-08 08:59:35
【问题描述】:
我已经制作了一个显示图像的应用程序。现在我想实现放大和缩小功能(通过使用两个指尖),就像在原生 Windows 手机照片查看器应用程序中一样。关于如何继续的任何想法。
提前致谢。
【问题讨论】:
-
目前提供了两个不错的选择
标签: c# silverlight silverlight-4.0 windows-phone-7
我已经制作了一个显示图像的应用程序。现在我想实现放大和缩小功能(通过使用两个指尖),就像在原生 Windows 手机照片查看器应用程序中一样。关于如何继续的任何想法。
提前致谢。
【问题讨论】:
标签: c# silverlight silverlight-4.0 windows-phone-7
也许最方便的方法是包含Silverlight for Windows Phone Toolkit。这包含一个GestureService,这将有助于捏合和旋转触摸手势。您可以将其应用于这样的图像:-
<Image Source="someSourceUrl" RenderTransformOrigin="0.5, 0.5" CacheMode="BitmapCache">
<Image.RenderTransform>
<CompositeTransform x:Name="transform" />
</Image.RenderTransform>
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener PinchStarted="OnPinchStarted" PinchDelta="OnPinchDelta" />
</toolkit:GestureService.GestureListener>
</Image>
然后在代码隐藏中:-
private void OnPinchStarted(object sender, PinchStartedGestureEventArgs e)
{
initialAngle = transform.Rotation;
initialScale = transform.ScaleX;
}
private void OnPinchDelta(object sender, PinchGestureEventArgs e)
{
transform.Rotation = initialAngle + e.TotalAngleDelta;
transform.ScaleX = initialScale * e.DistanceRatio;
transform.ScaleY = initialScale * e.DistanceRatio;
}
【讨论】:
BitmapImage 的新实例分配给现有Image 控件的Source 属性,而不是卸载和加载Image 元素的实例。此时,您还需要将变换上的 Rotation 设置为 0,并将 ScaleX 和 ScaleY 设置为 1。
Rotation 和ScaleX 相同,我认为是双打。
查看 Laurent Bugnion 的多点触控示例 - http://multitouch.codeplex.com/
【讨论】:
如果你想要支持多点触控的简单图像查看器,我建议你使用WebBrowser控件来显示图像。
默认支持多点触控缩放和平滑滚动。但是您必须将文件从项目文件夹复制到隔离存储。以下是我的做法:
<Grid x:Name="LayoutRoot" Background="Transparent">
<phone:WebBrowser
Name="MyWebBrowserControl"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0" />
</Grid>
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
// if image file does not exist in isolated storage, copy it to there~!
if (!isf.FileExists(filename))
{
StreamResourceInfo sr = Application.GetResourceStream(new Uri(filename, UriKind.Relative));
using (BinaryReader br = new BinaryReader(sr.Stream))
{
byte[] data = br.ReadBytes((int)sr.Stream.Length);
using (BinaryWriter bw = new BinaryWriter(isf.OpenFile(filename, FileMode.OpenOrCreate)))
{
bw.Write(data);
bw.Close();
}
br.Close();
}
}
Dispatcher.BeginInvoke(() => { MyWebBrowserControl.Navigate(new Uri(filename, UriKind.Relative)); });
※您必须将图像文件的Build Action设置为Content
【讨论】: