- 浏览: 868661 次
文章分类
最新评论
-
angel6709:
怎么下载啊
Android 蓝牙开发实例--蓝牙聊天程序的设计和实现 -
再_见孙悟空:
能识别中文不?
借@阿里巴巴 耍了个帅——HTML5 JavaScript实现图片文字识别与提取 -
在下个路口:
连接时总是报Unable to start Service D ...
Android 蓝牙开发实例--蓝牙聊天程序的设计和实现 -
mike.liu:
如果在社会上,站在政府的立场思考问题,是会被人说5毛的。但是在 ...
项目预估激发的矛盾 -
kjmmlzq19851226:
我的意思是说,公司采取两种策略:
1. 每月4k的基本工资,另 ...
项目预估激发的矛盾
【W8】windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放
实现方法:
对Manipulation进行抽象化 使不同容器可共用多点缩放事件,
C# 代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Windows.Foundation;
- using Windows.UI.Xaml;
- using Windows.UI.Xaml.Controls;
- using Windows.UI.Xaml.Input;
- using Windows.UI.Xaml.Media;
- using Windows.UI.Xaml.Media.Animation;
- namespace MetroTimeline
- {
- public class MetroManipulationHelper
- {
- /// <summary>
- /// 发生碰撞时的操作方法库
- /// </summary>
- public static Dictionary<Predicate<string>, Action<ManipulationDeltaRoutedEventArgs>>
- BoundaryFeedbackDict = new Dictionary<Predicate<string>, Action<ManipulationDeltaRoutedEventArgs>>();
- /// <summary>
- /// 多点触控开始后方法库
- /// </summary>
- public static Dictionary<Predicate<string>, Action<ManipulationStartedRoutedEventArgs>>
- ManipulationStartedDict = new Dictionary<Predicate<string>, Action<ManipulationStartedRoutedEventArgs>>();
- /// <summary>
- /// 多点触控完成后方法库
- /// </summary>
- public static Dictionary<Predicate<string>, Action<ManipulationCompletedRoutedEventArgs>>
- ManipulationCompletedDict = new Dictionary<Predicate<string>, Action<ManipulationCompletedRoutedEventArgs>>();
- /// <summary>
- /// 需要执行的方法的关键字
- /// </summary>
- private staticstring methodTag;
- public staticstring MethodTag
- {
- get { return MetroManipulationHelper.methodTag; }
- set { MetroManipulationHelper.methodTag = value; }
- }
- /// <summary>
- /// 将容器变为多点操控容器
- /// </summary>
- /// <param name="container"></param>
- /// <param name="mode"></param>
- /// <param name="trans"></param>
- /// <param name="scale"></param>
- /// <param name="rotation"></param>
- /// <param name="containerRect">容器相对父级菜单位置</param>
- public staticvoid InitManipulation(FrameworkElement container, ManipulationModes mode,
- double trans, double scale,double rotation, Rect containerRect)
- {
- BoundaryFeedbackDict.Add(s => s.Equals("default"), e =>
- {
- var element = e.OriginalSource as FrameworkElement;
- var con = e.Container as Panel;
- var elementBounds = element.RenderTransform.TransformBounds(new Rect(e.Position, element.RenderSize));
- Point fp = new Point((elementBounds.Left + elementBounds.Right) / 2, (elementBounds.Top + elementBounds.Bottom) / 2);
- if (fp.X < containerRect.Left ||
- fp.X > containerRect.Right ||
- fp.Y < containerRect.Top ||
- fp.Y > containerRect.Bottom)
- {
- e.Complete();
- }
- });
- container.ManipulationStarting += ElementManipulationEventHandler(container, mode);
- container.ManipulationDelta += ElementManipulationDeltaEventHandler();
- container.ManipulationStarted += ElementManipulationStartedEventHandler();
- container.ManipulationCompleted += ElementManipulationCompletedEventHandler();
- container.ManipulationInertiaStarting += ElementManipulationInertiaStartingEventHandler(trans, scale, rotation);
- foreach (var item in (containeras Panel).Children)
- {
- if (item.ManipulationMode == ManipulationModes.All)
- {
- var group = new TransformGroup();
- group.Children.Add(new TranslateTransform());
- group.Children.Add(new ScaleTransform());
- group.Children.Add(new RotateTransform());
- item.RenderTransform = group;
- }
- }
- }
- #region 多点手势方法
- #region 多点触控手势开始操作
- public static ManipulationStartingEventHandler ElementManipulationEventHandler(FrameworkElement element, ManipulationModes mode)
- {
- return (sender, e) =>
- {
- e.Container = element;
- e.Mode = mode;
- };
- }
- #endregion
- #region 多点触控手势过程中操作
- public static ManipulationDeltaEventHandler ElementManipulationDeltaEventHandler()
- {
- return ((sender, e) =>
- {
- var element = e.OriginalSource as FrameworkElement;
- var center = new Point(element.ActualWidth / 2, element.ActualHeight / 2);
- var tt = (element.RenderTransform as TransformGroup).Children[0]as TranslateTransform;
- tt.X += e.Delta.Translation.X;
- tt.Y += e.Delta.Translation.Y;
- var st = (element.RenderTransform as TransformGroup).Children[1]as ScaleTransform;
- st.CenterX = center.X;
- st.CenterY = center.Y;
- st.ScaleX *= e.Delta.Scale;
- st.ScaleY *= e.Delta.Scale;
- var rt = (element.RenderTransform as TransformGroup).Children[2]as RotateTransform;
- rt.CenterX = center.X;
- rt.CenterY = center.Y;
- rt.Angle += e.Delta.Rotation;
- if (e.IsInertial)
- if (null != BoundaryFeedbackDict)
- foreach (var item in BoundaryFeedbackDict)
- {
- if (null != MethodTag)
- if (item.Key(MethodTag)) item.Value(e);
- };
- });
- }
- #endregion
- #region 多点手势开始后
- private static ManipulationStartedEventHandler ElementManipulationStartedEventHandler()
- {
- return (sender, e) =>
- {
- if (null != ManipulationStartedDict)
- foreach (var itemin ManipulationStartedDict)
- {
- if (null != MethodTag)
- if (item.Key(MethodTag)) item.Value(e);
- };
- };
- }
- #endregion
- #region 多点手势完成
- private static ManipulationCompletedEventHandler ElementManipulationCompletedEventHandler()
- {
- return (sender, e) =>
- {
- if (null != ManipulationCompletedDict)
- foreach (var item in ManipulationCompletedDict)
- {
- if (null != MethodTag)
- if (item.Key(MethodTag)) item.Value(e);
- };
- };
- }
- #endregion
- #region 多点手势惯性开始
- /// <summary>
- ///
- /// </summary>
- /// <param name="trans">10</param>
- /// <param name="scale">0.1</param>
- /// <param name="rotation">540</param>
- /// <returns></returns>
- private static ManipulationInertiaStartingEventHandler ElementManipulationInertiaStartingEventHandler(double trans, double scale, double rotation)
- {
- return (sender, e) =>
- {
- e.TranslationBehavior.DesiredDeceleration = trans * 96.0 / (1000.0 * 1000.0);
- e.ExpansionBehavior.DesiredDeceleration = scale * 96 / 1000.0 * 1000.0;
- e.RotationBehavior.DesiredDeceleration = rotation / (1000.0 * 1000.0);
- };
- }
- #endregion
- #endregion
- }
- }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.Foundation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Media.Animation; namespace MetroTimeline { public class MetroManipulationHelper { /// <summary> /// 发生碰撞时的操作方法库 /// </summary> public static Dictionary<Predicate<string>, Action<ManipulationDeltaRoutedEventArgs>> BoundaryFeedbackDict = new Dictionary<Predicate<string>, Action<ManipulationDeltaRoutedEventArgs>>(); /// <summary> /// 多点触控开始后方法库 /// </summary> public static Dictionary<Predicate<string>, Action<ManipulationStartedRoutedEventArgs>> ManipulationStartedDict = new Dictionary<Predicate<string>, Action<ManipulationStartedRoutedEventArgs>>(); /// <summary> /// 多点触控完成后方法库 /// </summary> public static Dictionary<Predicate<string>, Action<ManipulationCompletedRoutedEventArgs>> ManipulationCompletedDict = new Dictionary<Predicate<string>, Action<ManipulationCompletedRoutedEventArgs>>(); /// <summary> /// 需要执行的方法的关键字 /// </summary> private static string methodTag; public static string MethodTag { get { return MetroManipulationHelper.methodTag; } set { MetroManipulationHelper.methodTag = value; } } /// <summary> /// 将容器变为多点操控容器 /// </summary> /// <param name="container"></param> /// <param name="mode"></param> /// <param name="trans"></param> /// <param name="scale"></param> /// <param name="rotation"></param> /// <param name="containerRect">容器相对父级菜单位置</param> public static void InitManipulation(FrameworkElement container, ManipulationModes mode, double trans, double scale, double rotation, Rect containerRect) { BoundaryFeedbackDict.Add(s => s.Equals("default"), e => { var element = e.OriginalSource as FrameworkElement; var con = e.Container as Panel; var elementBounds = element.RenderTransform.TransformBounds(new Rect(e.Position, element.RenderSize)); Point fp = new Point((elementBounds.Left + elementBounds.Right) / 2, (elementBounds.Top + elementBounds.Bottom) / 2); if (fp.X < containerRect.Left || fp.X > containerRect.Right || fp.Y < containerRect.Top || fp.Y > containerRect.Bottom) { e.Complete(); } }); container.ManipulationStarting += ElementManipulationEventHandler(container, mode); container.ManipulationDelta += ElementManipulationDeltaEventHandler(); container.ManipulationStarted += ElementManipulationStartedEventHandler(); container.ManipulationCompleted += ElementManipulationCompletedEventHandler(); container.ManipulationInertiaStarting += ElementManipulationInertiaStartingEventHandler(trans, scale, rotation); foreach (var item in (container as Panel).Children) { if (item.ManipulationMode == ManipulationModes.All) { var group = new TransformGroup(); group.Children.Add(new TranslateTransform()); group.Children.Add(new ScaleTransform()); group.Children.Add(new RotateTransform()); item.RenderTransform = group; } } } #region 多点手势方法 #region 多点触控手势开始操作 public static ManipulationStartingEventHandler ElementManipulationEventHandler(FrameworkElement element, ManipulationModes mode) { return (sender, e) => { e.Container = element; e.Mode = mode; }; } #endregion #region 多点触控手势过程中操作 public static ManipulationDeltaEventHandler ElementManipulationDeltaEventHandler() { return ((sender, e) => { var element = e.OriginalSource as FrameworkElement; var center = new Point(element.ActualWidth / 2, element.ActualHeight / 2); var tt = (element.RenderTransform as TransformGroup).Children[0] as TranslateTransform; tt.X += e.Delta.Translation.X; tt.Y += e.Delta.Translation.Y; var st = (element.RenderTransform as TransformGroup).Children[1] as ScaleTransform; st.CenterX = center.X; st.CenterY = center.Y; st.ScaleX *= e.Delta.Scale; st.ScaleY *= e.Delta.Scale; var rt = (element.RenderTransform as TransformGroup).Children[2] as RotateTransform; rt.CenterX = center.X; rt.CenterY = center.Y; rt.Angle += e.Delta.Rotation; if (e.IsInertial) if (null != BoundaryFeedbackDict) foreach (var item in BoundaryFeedbackDict) { if (null != MethodTag) if (item.Key(MethodTag)) item.Value(e); }; }); } #endregion #region 多点手势开始后 private static ManipulationStartedEventHandler ElementManipulationStartedEventHandler() { return (sender, e) => { if (null != ManipulationStartedDict) foreach (var item in ManipulationStartedDict) { if (null != MethodTag) if (item.Key(MethodTag)) item.Value(e); }; }; } #endregion #region 多点手势完成 private static ManipulationCompletedEventHandler ElementManipulationCompletedEventHandler() { return (sender, e) => { if (null != ManipulationCompletedDict) foreach (var item in ManipulationCompletedDict) { if (null != MethodTag) if (item.Key(MethodTag)) item.Value(e); }; }; } #endregion #region 多点手势惯性开始 /// <summary> /// /// </summary> /// <param name="trans">10</param> /// <param name="scale">0.1</param> /// <param name="rotation">540</param> /// <returns></returns> private static ManipulationInertiaStartingEventHandler ElementManipulationInertiaStartingEventHandler(double trans, double scale, double rotation) { return (sender, e) => { e.TranslationBehavior.DesiredDeceleration = trans * 96.0 / (1000.0 * 1000.0); e.ExpansionBehavior.DesiredDeceleration = scale * 96 / 1000.0 * 1000.0; e.RotationBehavior.DesiredDeceleration = rotation / (1000.0 * 1000.0); }; } #endregion #endregion } }
xaml :
- <Page
- x:Class="MetroTimeline.MainPage"
- IsTabStop="false"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:local="using:MetroTimeline"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d">
- <CanvasBackground="{StaticResource ApplicationPageBackgroundThemeBrush}"
- Width="1080"Height="500"
- x:Name="cvsContent"Tag="default">
- <TextBlockCanvas.Left="573"TextWrapping="Wrap"Text="TextBlock"x:Name="tbInfo"ManipulationMode="All"Margin="219,597,171,10"/>
- <ImageSource="Assets/PicWallLoading.jpg"ManipulationMode="All"Height="202"Canvas.Left="75"Canvas.Top="209"Width="153"/>
- <ImageSource="Assets/PicWallLoading.jpg"ManipulationMode="All"Height="202"Canvas.Left="333"Canvas.Top="83"Width="153"/>
- </Canvas>
- </Page>
<Page x:Class="MetroTimeline.MainPage" IsTabStop="false" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:MetroTimeline" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Canvas Background="{StaticResource ApplicationPageBackgroundThemeBrush}" Width="1080" Height="500" x:Name="cvsContent" Tag="default"> <TextBlock Canvas.Left="573" TextWrapping="Wrap" Text="TextBlock" x:Name="tbInfo" ManipulationMode="All" Margin="219,597,171,10"/> <Image Source="Assets/PicWallLoading.jpg" ManipulationMode="All" Height="202" Canvas.Left="75" Canvas.Top="209" Width="153"/> <Image Source="Assets/PicWallLoading.jpg" ManipulationMode="All" Height="202" Canvas.Left="333" Canvas.Top="83" Width="153"/> </Canvas> </Page>
使用方式:
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using Windows.Foundation;
- using Windows.Foundation.Collections;
- using Windows.UI.Xaml;
- using Windows.UI.Xaml.Controls;
- using Windows.UI.Xaml.Controls.Primitives;
- using Windows.UI.Xaml.Data;
- using Windows.UI.Xaml.Input;
- using Windows.UI.Xaml.Media;
- using Windows.UI.Xaml.Navigation;
- // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
- namespace MetroTimeline
- {
- /// <summary>
- /// An empty page that can be used on its own or navigated to within a Frame.
- /// </summary>
- public sealed partialclass MainPage : Page
- {
- public MainPage()
- {
- this.InitializeComponent();
- var conRect = new Rect(Canvas.GetLeft(cvsContent), Canvas.GetTop(cvsContent),
- cvsContent.Width, cvsContent.Height);
- MetroManipulationHelper.InitManipulation(cvsContent, ManipulationModes.All, 5, 0.5, 360, conRect);
- MetroManipulationHelper.MethodTag = cvsContent.Tag.ToString();
- }
- /// <summary>
- /// Invoked when this page is about to be displayed in a Frame.
- /// </summary>
- /// <param name="e">Event data that describes how this page was reached. The Parameter
- /// property is typically used to configure the page.</param>
- protected override void OnNavigatedTo(NavigationEventArgs e)
- {
- }
- }
- }
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 namespace MetroTimeline { /// <summary> /// An empty page that can be used on its own or navigated to within a Frame. /// </summary> public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); var conRect = new Rect(Canvas.GetLeft(cvsContent), Canvas.GetTop(cvsContent), cvsContent.Width, cvsContent.Height); MetroManipulationHelper.InitManipulation(cvsContent, ManipulationModes.All, 5, 0.5, 360, conRect); MetroManipulationHelper.MethodTag = cvsContent.Tag.ToString(); } /// <summary> /// Invoked when this page is about to be displayed in a Frame. /// </summary> /// <param name="e">Event data that describes how this page was reached. The Parameter /// property is typically used to configure the page.</param> protected override void OnNavigatedTo(NavigationEventArgs e) { } } }
conRect 为当前需要操作的容器 相对他父级容器的大小以及位置,用于判断多点元素的活动范围,
如果范围是全屏的话 则无需传该参数,进行相应修改即可
最后是效果图:
demo 下载地址:http://download.csdn.net/detail/wangrenzhu2011/4420853
相关推荐
将任意容器 中的任意内容变为可多点操作 放大 缩小旋转对象, 基于.net 4.5 metro开发 仅限metro Style 程序
支持对象检视器、API测试器等高级功能,支持界面的高度可定制性。还通过模板提供了一些功能的自定义性,并且还提供了方便的扩展接口。 3、直接使用 hhp 作为项目文件。这点是在功能之外我很看重的一个特性。许多同类...
Aspnet Mvc教程 1.说明 01:06 Aspnet Mvc教程 2.准备工作 02:37 Aspnet Mvc教程 3. 建立并运行 02:46 Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解...
c++ helper
PrecisionHelper,比较好的Chm制作工具 绿色版本。制作帮助文档必备
XMLHelper XMLHelper XMLHelper
主要介绍了IDEA插件推荐之Maven-Helper的相关知识,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考
Aspnet Mvc教程 1.说明 01:06 Aspnet Mvc教程 2.准备工作 02:37 Aspnet Mvc教程 3. 建立并运行 02:46 Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解...
最近要用到一个chm格式的说明文档,但在我电脑上打不开,想着反编重编,找了不少软件,没有一个如意的,后来找到 善用佳软 博客上推荐的这款,非常好用,且是免费,带中文。
Laravel开发-laravel-package-helper Laravel包的助手
IPHelper 本软件是『YaYa便利店』系列软件之一,主要功能为修 改网卡的IP地址,特别适用于移动办公用户和经常需要 在不同网段间切换的用户。新版本加入了许多新功能, 如果觉得实用请推荐给需要它的朋友,谢谢!
Android Typeface Helper,可以帮你轻松实现自定义字体的库,博客附件,效果请查看博客相对应项目。
xpath-helper
Aspnet Mvc教程 1.说明 01:06 Aspnet Mvc教程 2.准备工作 02:37 Aspnet Mvc教程 3. 建立并运行 02:46 Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解...
Precision Helper CHM制作大师 V2 0 1 7 绿色中文版 zip
video downloadhelper火狐浏览器 配合插件 亲测可用 2.0.10版本,2.0.10版本哦
MavenRunHelper
用于C#连接数据库,CSDN上找的两个MySQLHelper类,都挺好用,分享一下
使用maven管理依赖包时...MavenRunHelper插件作为解决冲突的利器,能够高效率的展示出冲突列表,快速解决冲突问题。由于网络等问题,常常无法下载插件。现提供IntelliI IDEA 2019.3+,2018.3+,2017.2+各版本的插件集合。
Aspnet Mvc教程 1.说明 01:06 Aspnet Mvc教程 2.准备工作 02:37 Aspnet Mvc教程 3. 建立并运行 02:46 Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解...