【问题标题】:Conditional XAML Crashes UWP App条件 XAML 使 UWP 应用程序崩溃
【发布时间】:2018-12-20 23:53:48
【问题描述】:

我的 UWP 应用程序的目标最小版本为 1703,最大版本为 1803。它还使用 AcrylicBrush,直到 1709 年才可用。我正在尝试使用条件 XAML 在当前版本支持时创建 AcrylicBrush (即版本为 1709 或更高版本)。

下面我有一个填充定义了两次的矩形,一次用于 1709 之前的任何内容,一次用于 1709 及更高版本。此代码有效

编辑

下面的代码应该是 Version1803 和 Not1803。拉斐尔的回答是正确的; Windows 10 Mobile 1709 会因此崩溃……但 1703 不应该……所以为了简单起见,只需将“1709”替换为“1803”即可。话虽如此,有谁知道它为什么会在 1703 上崩溃?

--编辑结束。

xmlns:Version1709="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract,5)"
xmlns:Not1709="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractNotPresent(Windows.Foundation.UniversalApiContract,5)"

<Rectangle x:Name="AcrylicRectangle">
     <Version1709:Rectangle.Fill>
           <AcrylicBrush Opacity="0.5"></AcrylicBrush> 
    </Version1709:Rectangle.Fill>
    <Not1709:Rectangle.Fill>
          <SolidColorBrush Color="Red" Opacity="0.5"></SolidColorBrush>
    </Not1709:Rectangle.Fill>
 </Rectangle>

这是独家新闻:1709 和更新的版本有一个透明的矩形(因为没有设置颜色),而 1709 之前的版本有一个红色的矩形,到目前为止一切都很好。这就是问题开始的地方。你会注意到我在 AcrylicBrush 中定义的唯一属性是不透明度;任何其他已定义的属性,如 TintColor、TintOpacity 等,都会使 1703 Mobile 上的应用程序崩溃。我尝试了许多不同的变体,但它们都有相同的问题:

<AcrylicBrush Version1709:TintColor="Red" Opacity="0.5"></AcrylicBrush>
<AcrylicBrush TintColor="Red" Opacity="0.5"></AcrylicBrush>
<Version1709:AcrylicBrush Version1709:TintColor="Red" Opacity="0.5"></Version1709:AcrylicBrush>
<Version1709:AcrylicBrush TintColor="Red" Opacity="0.5"></Version1709:AcrylicBrush>

从上面的四个 AcrylicBrushes 中,我在移动设备上的 1703 上运行时收到此错误:

激活 Windows 应用商店应用程序“a77e7506-7031-4935-ad70-ef56585020de_h83rr06hb5xc0!App”失败,并出现错误“Windows 无法与目标应用程序通信。这通常表明目标应用程序的进程已中止。更多信息可在“输出”窗口的“调试”窗格中获得(调试->Windows->输出)'。 程序“[6928] [UWPAppName].exe”已退出,代码为 -1073741189 (0xc000027b)。

我做错了什么?

编辑 当我说 1709 之前的版本时,只需要 1703,因为这是最低目标。低于 1703(内部版本 15063)的版本不支持条件 XAML,因此这不是问题。

【问题讨论】:

    标签: xaml uwp conditional


    【解决方案1】:

    Windows 10 移动版的最新版本不支持AcrylicBrush。 文档 (https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.media.acrylicbrush) 指定 AcrylicBrush 仅在 Fall Creators Update 10.0.16299 上可用,而该版本从未适用于移动设备(可用的最新版本是 10.0.15254.490)。

    我认为这里的问题是 AcrylicBrush 在最新的移动版本中不可用。

    这里的最佳选择是创建一个继承自 FrameworkElement 的类,并为您需要的属性添加 Attached DependencyProperties。在该类中检查合同级别,并根据该级别使用适当的画笔更新背景属性。

    【讨论】:

    • 尽管您提出了一个令人信服的观点,但我没有考虑过这一点,但我认为这并不能解释我在使用 Mobile build 15063 时遇到的问题。根据您的评论,我将条件更改为Version1803(用于亚克力)和 Not1803(用于普通),因为 Mobile 从未收到 1803,而且我不必担心像 1709 这样的不同版本号。它仍然不适用于 1703 Mobile。
    • @Mapplesoft 我终于有空闲时间来试试这个。我上面的回答仍然有效。 AcrylicBrush 仅适用于 10.0.16299 和更新版本。我将本机调试器附加到在我的 lumia 950xl 上运行的应用程序实例(最新可用的 win10 移动版本:15254.490),我收到以下错误:@ 987654326@ 显然你正在尝试做的事情在移动设备上不受支持,所以我的建议是按照上面的建议,使用 C# 代码进行条件检查。
    • 我在 C# 中使用了版本检查。似乎该应用程序正在尝试在移动设备上呈现条件 XAML,即使它不应该这样做。想不通为什么。可在不同版本的 Windows 10 桌面上运行!
    • @Mapplesoft 我认为可能发生的事情是调用引擎正在解析整个 xaml 文件,并且当它到达一个元素或属性时,它不知道它会引发异常(本机异常)。我不明白为什么它会这样。这很可能是 XAML 本身的一个错误。
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 2019-07-11
    • 2017-09-18
    • 2018-07-20
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多