win10 uwp 视差效果
我们觉得使用原来的微软ScrollView效果实在不好,我们需要一个好看的效果。如果你不知道我上面说的是什么,那么我应该来说我马上要做的,其实我们可以看到我们有很多层图片,在我们向下拉,他们下降不一样,给我们看来好像我们移动的是在一个有Z。这里说的Z是三维,因为三维XYZ。我们通过这个让我们的滚动看起来不是那么差。
其实我们可以看:http://www.cnblogs.com/JoannaQ/archive/2013/02/08/2909111.html 大神的解释很好
我们可以使用大神做的https://github.com/clarkezone/UWPCompositionDemos他用的很简单,我们需要滚动条,图片。他这个需要我们改多,所以我们做个可以添加到滚动条的控件,有滚动条的GridView,ListView,他们移动会让后面图片比前面下降少,如果我们滚动向下。
public class UIElementParallaxEffectBehavior : DependencyObject, IBehavior
{
public static readonly DependencyProperty ParallaxElementProperty =
DependencyProperty.Register(
"ParallaxElement",
typeof(UIElement),
typeof(UIElementParallaxEffectBehavior),
new PropertyMetadata(null, OnParallaxElementChanged));
public static readonly DependencyProperty ParallaxMultiplierProperty =
DependencyProperty.Register(
"ParallaxMultiplier",
typeof(double),
typeof(UIElementParallaxEffectBehavior),
new PropertyMetadata(0.3));
public double ParallaxMultiplier
{
get
{
return (double)GetValue(ParallaxMultiplierProperty);
}
set
{
SetValue(ParallaxMultiplierProperty, value);
}
}
private static void OnParallaxElementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var behavior = d as UIElementParallaxEffectBehavior;
behavior?.AttachParallaxEffect();
}
private void AttachParallaxEffect()
{
if (this.ParallaxElement != null && this.AssociatedObject != null)
{
var scrollViewer = this.AssociatedObject as ScrollViewer;
if (scrollViewer == null)
{
// Attempt to see if this is attached to a scroll-based control like a ListView or GridView.
scrollViewer = this.AssociatedObject.FindChildElementOfType<ScrollViewer>();
if (scrollViewer == null)
{
throw new InvalidOperationException("The associated object or one of it's child elements must be of type ScrollViewer.");
}
}
var compositionPropertySet =
ElementCompositionPreview.GetScrollViewerManipulationPropertySet(scrollViewer);
var compositor = compositionPropertySet.Compositor;
var animationExpression =
compositor.CreateExpressionAnimation("ScrollViewer.Translation.Y * Multiplier");
animationExpression.SetScalarParameter("Multiplier", (float)this.ParallaxMultiplier);
animationExpression.SetReferenceParameter("ScrollViewer", compositionPropertySet);
var visual = ElementCompositionPreview.GetElementVisual(this.ParallaxElement);
visual.StartAnimation("Offset.Y", animationExpression);
}
}
public UIElement ParallaxElement
{
get
{
return (UIElement)this.GetValue(ParallaxElementProperty);
}
set
{
this.SetValue(ParallaxElementProperty, value);
}
}
public void Attach(DependencyObject associatedObject)
{
if (this.AssociatedObject != null)
{
throw new InvalidOperationException("Cannot assign to the same behavior twice.");
}
this.AssociatedObject = associatedObject;
this.AttachParallaxEffect();
}
public void Detach()
{
this.AssociatedObject = null;
}
public DependencyObject AssociatedObject { get; private set; }
}

如果觉得我做的好复杂,也没有注释,那么我就想骂下垃圾微软,因为我做到这我的神器没法使用,我们来弄个简单,因为刚才我翻译的那个他做SDK,我们不是需要在背景弄一个图片,我们可以使用一个可以显示的。
当然我们需要在Nuget下载:https://www.nuget.org/packages/Microsoft.Xaml.Behaviors.Uwp.Managed/
源码:https://github.com/Microsoft/XamlBehaviors
我们将会修改微软的
public class ParallaxBehavior : Behavior<FrameworkElement>
{
public UIElement ParallaxContent
{
get { return (UIElement)GetValue(ParallaxContentProperty); }
set { SetValue(ParallaxContentProperty, value); }
}
public static readonly DependencyProperty ParallaxContentProperty = DependencyProperty.Register(
"ParallaxContent",
typeof(UIElement),
typeof(ParallaxBehavior),
new PropertyMetadata(null, OnParallaxContentChanged));
public double ParallaxMultiplier
{
get { return (double)GetValue(ParallaxMultiplierProperty); }
set { SetValue(ParallaxMultiplierProperty, value); }
}
public static readonly DependencyProperty ParallaxMultiplierProperty = DependencyProperty.Register(
"ParallaxMultiplier",
typeof(double),
typeof(ParallaxBehavior),
new PropertyMetadata(0.3d));
protected override void OnAttached()
{
base.OnAttached();
AssignParallax();
}
private void AssignParallax()
{
if (ParallaxContent == null) return;
if (AssociatedObject == null) return;
var scroller = AssociatedObject as ScrollViewer;
if (scroller == null)
{
scroller = AssociatedObject.GetChildOfType<ScrollViewer>();
}
if (scroller == null) return;
CompositionPropertySet scrollerViewerManipulation = ElementCompositionPreview.GetScrollViewerManipulationPropertySet(scroller);
Compositor compositor = scrollerViewerManipulation.Compositor;
ExpressionAnimation expression = compositor.CreateExpressionAnimation("ScrollManipululation.Translation.Y * ParallaxMultiplier");
expression.SetScalarParameter("ParallaxMultiplier", (float)ParallaxMultiplier);
expression.SetReferenceParameter("ScrollManipululation", scrollerViewerManipulation);
Visual textVisual = ElementCompositionPreview.GetElementVisual(ParallaxContent);
textVisual.StartAnimation("Offset.Y", expression);
}
private static void OnParallaxContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var b = d as ParallaxBehavior;
b.AssignParallax();
}
}
我们可以在Xaml
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Image x:Name="ParallaxImage" Source="ms-appx:///Assets/Guadeloupe.jpg" Stretch="Fill"/>
<ScrollViewer>
<TextBlock HorizontalAlignment="Stretch" TextWrapping="WrapWholeWords" FontSize="30" Foreground="Black">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nunc fringilla ultrices est eu ornare.
Suspendisse purus massa, iaculis in finibus dictum, gravida vel purus.
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
</TextBlock>
<interactivity:Interaction.Behaviors>
<behaviors:ParallaxBehavior ParallaxContent="{Binding ElementName=ParallaxImage}" />
</interactivity:Interaction.Behaviors>
</ScrollViewer>
</Grid>
上面代码是http://visuallylocated.com/post/2015/12/10/Easy-Parallax-effect-in-Windows-10.aspx修改,因为我现在没法使用神器,不知道他说的是不是对的。
好久没写,因为最近忙,要考试,所以现在也没有多少去查,如果看到不对的,希望大神能在我博客说。
我们刚才使用就是在有ScrollView的ListView可以使用,现在我们使用改的代码
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView>
<ListView.Header>
<Image x:Name="ParallaxImage" Source="ms-appx:///Assets/Guadeloupe.jpg" Stretch="UniformToFill"/>
</ListView.Header>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Background" Value="White"/>
</Style>
</ListView.ItemContainerStyle>
<x:String>Lorem ipsum dolor sit amet, consectetur adipiscing.</x:String>
<x:String>Nunc fringilla ultrices est eu ornare.</x:String>
<x:String>Suspendisse purus massa, iaculis in finibus dictum, gravida vel purus.</x:String>
<interactivity:Interaction.Behaviors>
<behaviors:ParallaxBehavior ParallaxContent="{Binding ElementName=ParallaxImage}" ParallaxMultiplier="-0.2"/>
</interactivity:Interaction.Behaviors>
</ListView>
</Grid>
我很少文章是自己原创,但是翻译也写不好
晚上1429081529在群里:地图是否可以离线使用,于是我就开了地图,在这时我们在说,pivot控件,是滑动到哪个页面,哪个页面才会开始加载的吗?经过LI大神的细心断点,发现只要已进入这个page,不管哪个pivotItem都会加载,但是里面的子控件只有滑到哪个页面时才会加载。
win10 uwp 视差效果的更多相关文章
- win10 uwp 萤火虫效果
原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...
- win10 UWP 蜘蛛网效果
我看见了知乎首页登录背景和普通的地球人写的博客,发现了个好看的效果. 那么我来告诉大家如何做这个效果. 第一步是在 Canvas 画点,第二步是让点移动,第三步是画线 在 Canvas 画一个点 我们 ...
- win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl
本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件. 在之前的入门教程win10 uwp win2d 入门 看这一篇就够了我直接用的是CanvasControl,实际上 ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- 【Win10 UWP】后台任务与动态磁贴
动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...
- win10 uwp 列表模板选择器
本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...
- win10 uwp 毛玻璃
毛玻璃在UWP很简单,不会和WPF那样伤性能. 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃. 毛玻璃可以使用 win2D 方法,也可以使用 Compositor . 使用 win2d 得 ...
- win10 uwp 渲染原理 DirectComposition 渲染
本文来告诉大家一个新的技术DirectComposition,在 win7 之后(实际上是 vista),微软正在考虑一个新的渲染机制 在 Windows Vista 就引入了一个服务,桌面窗口管理器 ...
随机推荐
- 作业2——需求分析&原型设计
需求分析: 软件的最终目的是用来解决用户的某些问题,需求分析就是要理解要解决的问题,真正明确用户需求.下面是我们初步的需求分析: 1.访问软件项目的真实用户(至少10个),确保软件真正体现用户的需求, ...
- 201521123051《Java程序设计》第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123010 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 ①互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1 ...
- JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作, ...
- 学习Python不得不关注和学习的国外大神博客
注意 : 本文收集于网路 . 由于常常更新 , 有些链接打不开, 请自备梯子 在学习Python过程中,总会遇到各种各样的坑, 虽然Python是一门优美而简单易学的语言 . 但当学习后 , 总想着更 ...
- 使用tcpdump拦截linux服务端网络数据
语法范例: tcpdump -vv -i ens3 '((tcp)&&(host 183.239.240.48)&&(port 3001))' -c 100 -w 1 ...
- Android Studio 导入应用时报错 Error:java.lang.RuntimeException: Some file crunching failed, see logs for details
在app文件夹的build.gradle里加上 android { ...... aaptOptions.cruncherEnabled = false aaptOptions.useNewCrunc ...
- 51nod 1451 合法三角形 判斜率去重,时间复杂度O(n^2)
题目: 这题我WA了3次,那3次是用向量求角度去重算的,不知道错在哪了,不得不换思路. 第4次用斜率去重一次就过了. 注意:n定义成long long,不然求C(3,n)时会溢出. 代码: #incl ...
- 斐波那契数列第N项f(N)[矩阵快速幂]
矩阵快速幂 定义矩阵A(m*n),B(p*q),A*B有意义当且仅当n=p.即A的列数等于B的行数. 且C=A*B,C(m*q). 例如: 进入正题,由于现在全国卷高考不考矩阵,也没多大了解.因为遇到 ...
- 如何创建一个Django项目
Django 软件框架 软件框架是由其中的各个模块组成,每个模块负责特定的功能,模块与模块之间相互协作来完成软件开发. MVC简介 MVC框架的核心思想是:解耦,让不同的代码块之间降低耦合,增强代码的 ...