信息
您所需的主题如下所示。但此主题未包含在此库中。

面向 Windows 8.1 的 API 更改 (XAML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

本文档指出了在 Windows 8.1 中引入的 API 移除、功能更改和优化。

为改进 Windows 8.1 中的应用,我们实施了重大的更改和优化。这些优化包括 XAML UI 控件更改、新的窗口大小模型、.NET 配置文件更改等。你会发现很多优化无需更改代码,但也有一些改进需要更改。我们鼓励你不再使用已弃用的 API,从而让你的应用达到最佳性能。

有关其他移植资源,请参阅:

要点  有关 Windows 8.1 中与使用 JavaScript 和 Internet Explorer 编程相关的 API 更改的详细信息,请参阅 Windows 8.1 的 API 更改(使用 JavaScript 和 HTML 的 Windows 应用商店应用)
 

影响特定 API 的更改

下表列出了在 Windows 8.1 中发生行为更改的 API。

API说明
ApplicationModel.Background namespace 后台任务基础结构会提前验证参数。有关详细信息,请参阅 BackgroundTaskBuilder 类和快速入门:创建和注册后台任务
ResourceLoader class Windows 应用商店应用 UI 可在多个监视器上显示。
ApplicationViewSwitcher.DisableShowingMainViewOnActivation method 对于可创建多个核心窗口的应用,会在激活后显示核心窗口。有关详细信息,请参阅多视图示例
LanguageFontGroup class 在 Windows 8.1 中,Windows 应用商店应用中使用的字体可能发生更改。
DisplayProperties class 有些 DisplayProperties 成员已被弃用,但也添加了一些新成员。如果你使用此 API,该更改可能导致生成错误和警告。
MediaCapture class 此更改涉及高延迟和低延迟录音。
PlayToConnectionErrorEventArgs class 当使用 PlayToConnectionErrorEventArgs 对象实现“播放到”功能的应用出现故障时,排除故障会非常困难,因为 PlayToConnectionError 枚举没有提示信息。
StorageFile.GetThumbnailAsync method 在 Windows 8.1 中,此方法可返回任何大小的缩略图。
CoreDispatcher.ProcessEvents method 以递归方式调用此方法可能导致你的应用失败。而且,必须只从创建了 CoreWindow 的线程调用 CoreDispatcher.ProcessEvents。从其他线程调用此方法将失败,并带有显式错误。
CoreDispatcher.AcceleratorKeyActivated event Windows 8.1 中的键盘焦点 Tab 键导航将转到 UI 中的正确对象。
PropertyAnimation class 在应用从一个动画过渡到另一个动画时,Windows 8.1 中的动画属性更加流畅。此更改还会影响 Storyboard.Begin 方法。
Application.LoadComponent(Object, Uri) method 在 Windows 8.1 中,在标记过程中不会完整创建资源字典。
FlipView.UseTouchAnimationsForAllNavigation property 在 Windows 8.1 中,项目之间的移动在任何情况下都将以动画形式表现,而不仅是在触摸时。
Control.Focus method 设置编程焦点已更改。有关详细信息,请参阅 FocusState property
FrameworkElement.LayoutUpdated event 如果某应用附加有两个侦听器,在删除其中一个侦听器时,将只删除该侦听器。
ItemsPresenter.Header property 在标头中设置的 VerticalAlignmentHorizontalAlignment 属性是有效属性。此更改还会影响 ItemsPresenter.HeaderTemplate property
FrameworkElement.BaseUri property 可以为 XAML 定义的模板部分解析特定于文件 URI。
AutomationPeer.GetPatternCore method 控件可以为 Microsoft UI 自动化提供其自身的项目对等行为。
UIElement.ManipulationMode property ManipulationModes enumeration 允许 System 与其他值组合在一起。
UIElement.ManipulationStarting event ManipulationStarting event 得到正确触发。此更改还会影响 UIElement.ManipulationCompletedControl.OnManipulationStarting 事件。
UIElement.PointerEntered event PointerEntered event 现在可正确触发。此更改还会影响 UIElement.PointerExited event
UIElement.PointerWheelChanged event 为 Track Pad 手势增加了直接操作支持。
UIElement.RightTapped event 在 Windows 8.1 中,对此事件的事件数据中的 X/Y 位置值进行了正确的排序。此更改还会影响 Control.OnRightTappedRightTappedRoutedEventArgs.GetPosition 方法。
VisualTransition class XAML 过渡动画在 Windows 8.1 中可自动关闭分散注意力的动画。
ListView class XAML ListViewGridView 控件显示项目列表,并允许用户选择项目。
WebView class 请参阅有关 WebView 控件的重大行为更改的主题。
ComboBox.MaxDropDownHeight property 在 Windows 8.1 中将不再忽略此属性。
MediaElement class 在 Windows 8.1 中,MediaElement 布局类似于其他 XAML 控件。
Image.ImageOpened event 从 Windows 8.1 开始,XAML 将在显示比例变化时自动重新加载图像。此更改还会影响 ImageFailed event
TextBox.IsColorFontEnabled property 除非在 Windows 8.1 中相应重建,否则应用中的文本控件将无法呈现多颜色字体。此更改还会影响 TextBlock.IsColorFontEnabledRichEditBox.IsColorFontEnabledRichTextBlock.IsColorFontEnabled 属性。
ImageBrush.ImageSource property 利用 ImageBrush.ImageSource 属性,Windows 8.1 中的应用可将 URI 解析到应用程序包中的正确位置。
VisualTreeHelper class 在 Windows 8.1 中,VisualTreeHelper API 可验证调用方是否在正确的线程上进行调用。
Storyboard.GetCurrentState method 在动画使用 BeginTime 值的情况下,此方法可在 Windows 8.1 中返回正确的值。
BitmapImage.UriSource property 在 Windows 8.1 中,已从设置器中删除 URI 验证。

 

性能改进

下表列出了在 Windows 8.1 中的性能改进。

更改描述
C# 引用的性能改进Windows 应用商店应用提高了垃圾回收速度。有关详细信息,请参阅改进垃圾回收性能
关闭后快速重新启动应用最多有五秒钟时间来完成终止,这使它们能够快速重新启动。
“呈现所有错误”功能事件处理程序中发生的错误现在会传播。
在挂起发生时提供低优先级访问为了改进系统响应性,对于挂起状态的应用,我们只给予低优先级的资源访问权限。有关详细信息,请参阅如何暂停应用
窗口大小模型我们在 Windows 8.1 中添加了新的窗口大小模型,以支持更加丰富的多任务场景。
更正 XAML 列表控件中的焦点导航 当用户使用 Tab 键将键盘焦点转到列表控件时,焦点将转到正确的项目。有关详细信息,请参阅 FlipViewItem class
ListView 和 GridView 性能改进 GridViewItemListViewItem 的默认控件模板中的所有 UIElement 对象已被删除,从而显著改进了性能。有关详细信息,请参阅使用 GridView 和 ListView 控件改进应用的启动时间
改进 Web 安全为 Windows 8 构建的应用可在其应用程序内容 URI 中包含 httphttps URI,而除了在其 AppxManifest.xml 文件中指定的动态 ContentUriRules 之外,为 Windows 8.1 构建的应用可能只包含 https URI。有关详细信息,请参阅 Windows 兼容性手册中的 Windows 8.1 只允许使用 https URI,不允许使用 http URI
ItemsControl.PrepareContainerForItemOverride method 在有可用的 CPU 时间时,会将 Content 属性设置为正确的值。
VirtualSurfaceImageSource constructor 参数验证的最大大小已从 100,000,000 更改为 17,000,000。

 

缓解性更改

下表列出了可能会对在 Windows 8.1 中运行的应用产生影响的更改。

更改说明
LayoutAwarePage 导致应用中断Microsoft Visual Studio 2013 模板中不再包含 LayoutAwarePage 类。
可移植类库可移植类库不适用于 Microsoft Visual Studio Express 2013 for Windows。
Visual C 库更改Visual C 库已对 assert()exit() 进行更改。有关详细信息,请参阅 Windows 应用认证工具包测试的“备注”部分
进行筛选时,控件视图会丢失一些部分在 Windows 8.1 中会将元素添加到 UI 自动化控件视图。
Windows 事件跟踪 (ETW) 事件在 Windows 8.1 中,将不会再引发 ETW 事件。

 

更改说明

进行筛选时,控件视图会丢失一些部分

XAML 元素树的某些部分不会显示在 UI 自动化树中的筛选控件视图中。在 Windows 8.1 中,我们在控件视图中包括了更多元素,从而修复了这一问题。但是,在控件视图中显示的一些元素不应该显示在该视图中。可在 XAML 元素上设置新的附加属性 AutomationProperties.AccessibilityView,从而使应用开发人员能够指定不应在控件视图中显示的元素。在 Windows 8.1 中,我们更新了内置的 XAML 控件模板,以便适当使用新属性。如果 Windows 8 应用具有自定义控件,或用于内置控件的自定义模板,则它们需要设置新属性。

Windows 事件跟踪 (ETW) 事件

在 Windows 8 中,XAML 在其排序器中跟踪 ETW 事件。在 Windows 8.1 中,我们用 DirectComposition 取代了进程内排序器,因此不会再引发这类 ETW 事件。不要将添加或删除跟踪视为兼容性问题。

LayoutAwarePage 导致应用中断

在 Windows 8 中,Microsoft Visual Studio 模板定义 LayoutAwarePage 类,以管理基于 ApplicationViewState 的视觉状态。在 Windows 8.1 中,已弃用 ApplicationViewState,并且 Windows 应用商店应用的 Visual Studio 模板中不再包含 LayoutAwarePage。继续使用 LayoutAwarePage 会导致你的应用中断。若要修复此问题,请重新编写你的视图,以适应新的最小分辨率,并基于窗口大小创建事件。如果你通过更新调整应用的大小,则必须处理 Window.SizeChanged 事件,以便使你的应用 UI 适应新的大小。我们建议你停止使用 LayoutAwarePage 类,并从“Page”类直接继承类。

以下是停止使用 LayoutAwarePage 的方法:


protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    this.Loaded += PageLoaded;
    this.Unloaded += PageUnloaded;
 }

 private void PageUnloaded(object sender, RoutedEventArgs e)
 {
     Window.Current.SizeChanged -= Window_SizeChanged;
 }

 private void PageLoaded(object sender, RoutedEventArgs e)
 {
     Window.Current.SizeChanged += Window_SizeChanged;
 }

 private void Window_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
 {
     if (e.Size.Width <= 500)
     {
     //VisualStateManager.GoToState(this, state.State, transitions);
     }
     else if (e.Size.Height > e.Size.Width)
     {
     //VisualStateManager.GoToState(this, state.State, transitions);
     }
     else
     {
     //VisualStateManager.GoToState(this, state.State, transitions);
     }
 }


可移植类库

可移植类库仅可用于 Microsoft Visual Studio Professional 2013。它在 Visual Studio Express 2013 for Windows 中不可用。

ListView 和 GridView 性能改进

GroupStyle 类

我们弃用和省略了 ListViewGridViewGroupStyle 类的三个属性。当 ItemsPanelItemsStackPanel 时,不再考虑 GroupStyle 的属性 PanelContainerStyleContainerStyleSelectorListViewGridView 的布局方式类似于传统列表 — 从页首到底部。因此,如果应用没有显式设置 ItemsPanel,而是设置了 PanelContainerStyleContainerStyleSelector,则在面向 Windows 8.1 重新编译的 Windows 8 应用中,组中项目的布局和外观不会发生更改。与内部结构和默认 ListView 对象具有依赖关系的应用可能会崩溃,因为当 GroupStyle.PanelItemsStackPanel 时,ItemsPanel 的类型将会更改,而且不会创建 GroupItems。在浏览可视化树时,发生这种崩溃的可能性很大。

可通过将 ItemsPanel 重新设置为 Windows 8 面板 (VirtualizingStackPanel) 或取消有关可视化树结构的假设,从而避免这种情况。

ItemsPanel 属性

在 Windows 8.1 中,默认 ItemsPanel 属性已更改。在 Windows 8 中,ListView 的默认 ItemsPanelVirtualizingStackPanelGridView 的默认 ItemsPanelWrapGrid。在 Windows 8.1 中,ListView 的默认值为 ItemsStackPanelGridView 的默认值为 ItemsWrapGrid。在浏览可视化树时,这一更改可能导致崩溃。解决方法是将 ItemsPanel 属性重新设置为 Windows 8 默认值。

关闭后快速重新启动

在 Windows 8.1 中,如果用户关闭应用,然后立即重新启动应用,则在重新启动之前,将为关闭的应用提供最长五秒种时间来完成其终止。而在 Windows 8 中,应用在重新启动时立即终止。

“呈现所有错误”功能

在 Windows 8.1 中,事件处理程序中发生的错误现在会传播。没有处理的错误将会触发应用程序终止。在终止之前,CoreApplication::UnhandledErrorDetected 事件触发,为开发人员提供处理错误的机会,从而避免终止。请注意,该事件不会替代 XAML UnhandledException 事件。使用 XAML 的 Windows 应用商店应用中的未处理错误会同时引发两种事件,开发人员可以自由使用更加适合应用的任何一种事件。

窗口大小模型

我们在 Windows 8.1 中添加了新的窗口大小模型,以支持更加丰富的多任务场景。 独立视图状态的概念不复存在,不再需要贴靠状态。相反,应用可以不断调整为任何大小,直至达到最小的大小。应用的最小宽度为 500 像素或 200 像素。默认情况下,应用的最小大小为 500 像素。

Windows 8 的  ApplicationView.Value 属性和 ApplicationView.TryUnsnap 方法已被弃用,如果你的应用使用它们,则会收到编译器警告。应用应该注册窗口调整大小事件,以便知道何时更新布局。但是,无需再调用 ApplicationView.Value 来查明应用所处的视图状态,而是使用 Window.CurrentWindow.Bounds 属性来获取普通窗口大小信息,或使用 ApplicationView.GetForCurrentViewApplicationView.Orientation 属性来获取方向信息。在 Windows 8.1 中,由应用设计人员负责确定应用可以采用哪些窗口大小阈值和媒体查询来更新应用布局。

下面是移植代码的一些可能的方法。

查看普通窗口大小:

Windows 8

private void WindowSizeChanged(object sender, WindowSizeChangedEventArgs e) {
    // Get view state
    ApplicationViewState currentViewState = ApplicationView.Value;
 
    if (currentViewState == ApplicationViewState.FullScreenLandscape) {
       // Full screen Landscape layout
    }
    else if (currentViewState == ApplicationViewState.FullScreenPortrait) {
       // Full screen Portrait layout
    }
    else if (currentViewState == ApplicationViewState.Filled) {
       // Filled layout
    }
    else if (currentViewState == ApplicationViewState.Snapped) {
       // Snapped layout
    }
}


Windows 8.1

private void WindowSizeChanged(object sender, WindowSizeChangedEventArgs e) {
        // Get window size
        var WindowWidth = Window.Current.Bounds.Width;
 
        // App code to change layout based on window width
}


查看方向:

Windows 8

private void WindowSizeChanged(object sender, WindowSizeChangedEventArgs e) {
    // Get view state
    ApplicationViewState currentViewState = ApplicationView.Value;
 
    if (currentViewState == ApplicationViewState.FullScreenLandscape || currentViewState == ApplicationViewState.Filled) {
       // Landscape layouts
    }
    else if (currentViewState == ApplicationViewState.FullScreenPortrait) {
       // Portrait layouts
    }
}


Windows 8.1

private void WindowSizeChanged(object sender, WindowSizeChangedEventArgs e) {
    // Get window orientation
    ApplicationViewOrientation winOrientation = ApplicationView.GetForCurrentView().Orientation;
 
    if (winOrientation == ApplicationViewOrientation.Landscape) {
       // Landscape layouts
    }
    else if (winOrientation == ApplicationViewOrientation.Portrait) {
       // Portrait layouts
    }
}


相关主题

面向 Windows 8.1 重新定位 Windows 应用商店应用
已更新示例
DirectX 编程
Windows 8.1 的 API 更改(使用 JavaScript 和 HTML 的 Windows 应用商店应用)

 

 

显示: