WP8.1 UI 编程 一、程序界面

参考自林政《深入理解Windows Phone8.1 UI控件编程》,仅仅是我个人的总结,不能做学习用。后面文章同。

1. XAML是什么就不解释了,其实它经编译器形成.g.cs文件

obj\Debug\*.g.cs

如果XAML中声明的控件有x:Name属性,则会在.g.cs文件中生成对应代码。此文件也定义了InitializeComponent方法,由页面类的构造方法调用。

并且它是成功编译后才生成的,而同目录下*.g.i.cs文件则是在XAML修改后就静态生成,可以用于VS的智能感知等功能。

XAML可使用XamlReader.Load动态加载,这样在程序运行中也可以按情况加载指定的XAML了

如:

string myButtonXaml = "这里是格式良好的XAML片段";         //注意转义和命名空间
Button myButton = XamlReader.Load(myButtonXaml) as Button;

不仅是控件,动画等其它XAML代码一样可以。

但这里格式良好的XAML必须是单个根元素,且必须指定某一默认的XML命名空间,通常是xmlns:="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

2. XAML的树结构

XAML中创建的程序UI概念化为一个对象树(元素树),对象树可进一步分为逻辑树和可视化树。

逻辑树:直观根据控件父子关系构造生成的,在路由事件中将会按这样的层次结构来触发。

可视化树是XAML中可视化控件及其子控件组成的一个树形控件元素结构图。

对象树:XAML中的元素具有属性,则此元素就是对象树中的一个对象。而某对象的某属性如果也是一个对象,则它们在对象树中互为父子关系。

可视化树:将对象树编辑或筛选后的表现形式,其中的对象是具有呈现意义的对象(具有呈现意义,并不是指一定要在界面中显示出来),集成在控件中并不直接显示的对象也是可视化树里的元素。

至此可以确定WP中可视化对象的呈现顺序,从可视化树最顶层节点元素开始遍历,遍历方法类似二叉树的先序遍历。因此可视化元素的内容优先于其本身呈现。

VisualTreeHelper是一个静态帮助器类,提供可视化对象级别编程的低级功能。

应用举例:ListBox中封装了ScrollViewer,获取它就可以判断ListBox是否滚到底,从而实现分页加载。

3. 路由事件

路由事件有三种路由策略:

冒泡:从引发事件的对象元素子集冒泡到包含这些子集的父对象元素,出现的事件及数据一路报告给沿着事件路由的对象,直到达到根事件。

直接:只有源对象本身才能调用。

隧道:与冒泡相反。

WP中的事件要么遵循冒泡路由策略,要么不路由。

事件处理方法中,参数sender就是发送对象;e是事件参数,作为EventArgs或其子类的实例。

e的几个重要方面

OriginalSource属性:当事件冒泡时,sender不再是事件引发对象,而是正在调用的处理程序的对象。而OriginalSource都报告引发事件的原始对象。

Handled属性:是一个布尔值,当把值设置为true,意味着大多数路由事件处理程序将停止路由,表示路由事件处理完毕。并非所有路由事件都可使用这种方法停止。

可视化树外的路由事件:可视化树外的部分将不会通过父子关系捕获路由事件。如Popup控件,如果要处理Popup路由事件,则应将处理程序置于Popup内的特定UI元素上(而非Popup本身)。Popup本身永远不会接收路由事件。

4. 框架Frame和页面Page

一个WP程序有一个框架和多个页面,框架相当于包含这些页面的容器。当前Frame可通过Window.Current.Content获取。

Page的导航逻辑使用一个栈来管理,因为页面是先进后出。可以通过Frame.BackStack获取栈的项目。

5. UI线程

UI线程即主线程,仅存在一个。其它的线程为后台线程。应尽量保持UI线程的“轻量”,耗时操作应在后台线程中执行。

创建后台线程:

Task.Factory.StartNew(() =>
            {
                //执行相关后台线程的操作
            });

在后台线程中访问UI线程中的对象:

await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
            {
                //访问UI线程中的对象
            });

如果无法获取到已经启动的UI元素,则要在后台线程中启动UI线程:

await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
            {
                //执行UI线程操作
            });

如果使用SynchronizationContext,提供不带同步的自由线程上下文,可以针对不同的异步模型采取正确的行为:

SynchronizationContext context;
context = SynchronizationContext.Current;

后台线程中就可以:

context.Post(async (s) =>
            {
                //处理相关UI线程操作
            }, null);
时间: 2024-10-06 00:55:58

WP8.1 UI 编程 一、程序界面的相关文章

WP8.1 UI 编程 七、动画

1. 普通动画的目标属性: 普通UI控件属性,如Width,Height等:变换特效属性:三维变换特效属性. 普通UI控件属性会触发布局系统重新工作,因此首选后两种属性进行动画运用. 动画类位于Windows.UI.Xaml.Media.Animation命名空间下. 基于时间线动画,继承自Timeline: 线性插值动画,即From/To/By动画,反映对象在指定时间范围内持续渐变. 关键帧动画,更强大,可以指定任意数量目标值,控制它们之间的插值方法. 基于帧动画: 有些动画无法通过以上方法实

WP8.1 UI 编程 三、布局

1. Panel是所有布局面板的父类.常用的布局面板: Canvas,子元素可以根据区域内坐标定位. StackPanel,栈面板,布局结构就像一个栈,只有水平竖直两种方向. Grid,网格,子元素可以根据行列布局. 如果不需要进行复杂的布局,应尽量用相对简单的布局面板以提升表现,如用Canvas替代Grid. 布局是一个递归系统,先进行测量,再进行排列.测量是测量子元素所需大小,排列是最终子元素大小及位置. 应尽量减少重新布局,以提升表现. UI元素有两个重要的类UIElement和Frame

WP8.1 UI 编程 十一、列表

1. 列表控件: ItemsControl:最基本的列表控件,原生不支持滚动和虚拟化等.ListBox,Pivot,Hub等控件就是从它派生. ListBox:使用广泛的列表控件,支持虚拟化. ListView:WP8.1新增,比ListBox更强大,可以定义HeaderTemplate和FooterTemplate,可以通过ContainerContentChanging事件来获取列表数据虚拟化运行情况. GridView:WP8.1新增,网格控件,类似Toolkit中的WrapPanel,支

WP8.1 UI 编程 二、样式和模板

1. 每个控件都有一个Resources属性,把样式放在这个Resources里,就可以作为静态资源给这个控件的可视化树下的控件使用.如果定义在Page上,则整个页面都可以使用:同样Application上整个App都可以使用. Style的TargetType属性不一定要和使用这个样式的控件类保持一致,可以设置为它的父类.例如,设置为FrameworkElement也可以被TextBlock使用. 要Style实现继承,只需设置它的BasedOn属性. Style可以以编程方式动态创建和设置.

WP8.1 UI 编程 九、控件编程

1. 控件继承关系 UIElement ↑ FrameworkElement ↑                  ↑ Panel           Control ↑      ↑ ContentControl   ItemsControl UIElement是具有可视化外挂并且可以处理基本输入的大多数对象的基类,但不公开构造方法,其作用就是作为Framework的基类,对UI的基础操作进行封装. FrameworkElement扩展了UIElement,并添加布局相关方法和属性和对数据绑定

WP8.1 UI 编程 六、变换特效和三维特效

1. 变换特效 变换原理:是二维变换矩阵 M11 M12 0 M21 M22 0 OffsetX OffsetY  1 WP只支持仿射变换,因此矩阵右边是0.0.1. (x,y,1)乘矩阵得到(x1,y1,1),新坐标为(x1,y1). 即:坐标(x,y)经矩阵变换后,新坐标为(x*M11 + y*M21 + OffsetX,x*M12 + y*M22 + OffsetY). WP提供了很多Transform类以变换对象,只需应用到UIElement的RenderTransform属性即可. 列

WP8.1 UI 编程 四、图形

1. 图形中常用的基本的类 Point:(x,y)坐标确定的点. Size:由Height和Width确定高宽的大小类. Rect:矩形类,显然可以由一个Point和一个Size来确定. Color:由R.G.B.A确定的颜色类. Geometry和Shape都是定义空间区域的类,Shape拥有相关的画笔并可以呈现到屏幕,而Geometry不会. Shape常用属性: Fill:填充的Brush Stroke:笔触,边界颜色Brush StrokeThickness:边界厚度 Stretch:填

Java 并发编程之图形界面应用程序及死锁问题

不知道为什么这本书还要讲一个界面应用程序,Java的界面做的很糟糕,效率低下,而且界面是java的弱项,可能是因为这里边是有一些并发编程的知识吧. 为什么GUI是单线程的 无论是Swing还是AWT都是单线程的.但它不仅限于在java中,在Qt,NexiStep,macOs CoCoa X windows以及其它环境中的GUI框架都是单线程的,许多人都曾经尝试编写多线程的GUI框架,但最终都由于竞态条件和死锁导致的稳定性问题而又重新回到单线程的事件队列模型:采用一个专门的线程从队列中抽取事件,并

iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(一)

iOS开发UI篇-以微博界面为例使用纯代码自定义cell程序编码全过程(一) 一.storyboard的处理 直接让控制器继承uitableview controller,然后在storyboard中把继承自uiviewcontroller的控制器干掉,重新拖一个tableview controller,和主控制器进行连线. 项目结构和plist文件 二.程序逻辑业务的处理 第一步,把配图和plist中拿到项目中,加载plist数据(非png的图片放到spooding files中) 第二步,字