WINUI——Microsoft.UI.Xaml.Markup.XamlParseException:“无法找到与此错误代码关联的文本。

news2024/9/28 21:25:19

开发环境

VS2022

.net core6

问题现象

在Canvas内的子控件要绑定Canvas的兄弟控件的一个属性,在运行时出现了下述报错。

可能原因

在 WinUI(特别是用于 UWP 或 Windows App SDK 的版本)中,如果你尝试在 XAML 中将 Canvas 内的子控件绑定到 Canvas 的兄弟控件(即与 Canvas 同级但在不同父容器下的控件),你可能会遇到 XamlParseException 或类似的错误,因为标准的数据绑定通常基于父子关系或特定的数据源上下文(如 DataContext)。

原因分析

  1. 上下文不匹配:Canvas 内的控件默认尝试在其父级或更高级别的 DataContext 中查找绑定的源。如果绑定的目标控件(兄弟控件)不在相同的 DataContext 路径上,则无法直接访问。

  2. XAML 绑定限制:XAML 绑定通常不直接支持跨树(跨不同父容器)的绑定。这意味着你不能直接从一个控件绑定到另一个在 XAML 视觉树中不相邻的控件。

解决方案

  1. 使用中介数据源
    • 创建一个在更高级别(如页面或用户控件的 DataContext)可访问的数据源(如 ViewModel)。
    • 将需要共享的数据放入这个数据源中。
    • 然后,从 Canvas 内的子控件和兄弟控件都绑定到这个数据源。
  2. 使用代码后置
    • 在代码后置(C# 或 C++/WinRT)中,你可以更灵活地处理控件之间的交互和数据传递。
    • 例如,你可以在页面加载时,通过代码将兄弟控件的值传递给 Canvas 内的子控件。
  3. 使用附加属性
    • 如果适用,你可以创建一个附加属性,该属性可以在多个控件之间共享数据。
    • 然后,你可以在 XAML 中为这些控件设置这个附加属性,或者在代码后置中处理它。
  4. 重构 UI 结构
    • 考虑重新设计你的 UI 结构,以便需要交互的控件位于相同的父容器中。
    • 这可能涉及将 Canvas 嵌入到一个能够容纳所有相关控件的容器中。

以上为AI给出的一些分析,解决方案中的1和2本质一样的,使用1或2都一定要实现INotifyProperty接口,如果这个属性变化时需要通知UI的话。

原因验证

按AI给出的原因2,尝试将Canvas的兄弟控件ViewBox的HorizontalAlignment先绑定到Canvas的Tag上,再在Canvas的子控件上获取Canvas的Tag属性。结果仍还报Microsoft.UI.Xaml.Markup.XamlParseException错误。

开始以为是Tag是object,需要转化为HorizontalAlignment或字符串,但使用Conver转化后仍报XamlParseException错误。

这就说明这应该不是跨树的问题了,因为Canvas绑定的ViewBox的属性没有任何问题,但在将Canvas的Tag绑定到Canvas的子控件时才出了XamlParseException,也就是说Canvas与它的子控件肯定是在同一可视树上的,且肯定是同树枝的。

但同树且同枝时还出现了XamlParseException这是为何?此还有待进一步深究。

那么原因1就正确吗?

至于原因1,先看一下下述常见的Slider值绑定TextBox。下述的TextBox与Slider肯定拥有相同父控件的,在相同的父DataContext路径上,这种绑定是没有问题的。

        <StackPanel
            Width="400"
            Height="100"
            HorizontalAlignment="Right"
            Background="Green">
            <TextBox Text="{Binding ElementName=slider, Path=Value, Mode=TwoWay}" />
            <Slider
                x:Name="slider"
                Width="300"
                Maximum="50"
                Minimum="0" />
        </StackPanel>

再看下边的xaml,在Canvas中的TextBlock也绑定了Canvas的兄弟控件Slider。

        <StackPanel
            Width="400"
            Height="200"
            HorizontalAlignment="Right"
            Background="Green">
            <TextBox Text="{Binding ElementName=slider, Path=Value, Mode=TwoWay}" />
            <Slider
                x:Name="slider"
                Width="300"
                Maximum="50"
                Minimum="0" />
            <Canvas
                x:Name="canvas"
                Height="50"
                Background="Red">
                <TextBlock
                    Canvas.Left="10"
                    Canvas.Top="10"
                    Text="{Binding ElementName=slider, Path=Value}" />
            </Canvas>
        </StackPanel>

但Canvas的子控件却能绑定成功,如下所示,红色Canvas内数字的变化是完全没有问题的。

但xaml如下时,将TextBlock的属性绑定到Canvas的子控件的HorizontalAlignment时,就会失效(不会报错XamlParseException;本次报错的是要绑定到自定义的依赖属性)

   <StackPanel
       Width="400"
       Height="200"
       HorizontalAlignment="Right"
       Background="Green">
       <TextBox Text="{Binding ElementName=slider, Path=Value, Mode=TwoWay}" />
       <Slider
           x:Name="slider"
           Width="300"
           Maximum="50"
           Minimum="0" />
       <TextBlock
           x:Name="textBlock"
           Height="20"
           Tapped="TextBlock_Tapped"
           Text="Test" />
       <Canvas
           x:Name="canvas"
           Height="50"
           Background="Red"
           Tag="{Binding ElementName=textBlock, Path=HorizontalAlignment}">
           <TextBlock
               Canvas.Left="10"
               Canvas.Top="10"
               HorizontalAlignment="{Binding ElementName=canvas, Path=Tag}"
               Text="{Binding ElementName=slider, Path=Value}" />
       </Canvas>
   </StackPanel>

后台代码如下:

 private void TextBlock_Tapped(object sender, TappedRoutedEventArgs e)
 {
     var textblock = sender as TextBlock;
     if (textblock.HorizontalAlignment == HorizontalAlignment.Left)
     {
         textblock.HorizontalAlignment = HorizontalAlignment.Right;
     }
     else
     {
         textblock.HorizontalAlignment = HorizontalAlignment.Left;
     }
 }

运行时如下,红色Canvas内的TextBlock完全没有响应,但是没有报错XamlParseException。

综上两个例子,可以看出,AI给出的原因1也并不靠谱。

解决办法验证

前边已经将AI给出的原因验证了一遍,两个原因都经不起推敲。这节来验证一下它给出的方法,这是由于AI的原因和结果并没有一定的必然联系,于是原因验证后结果也可以进行相应的验证。

对于它给出的4个方法,愚以为仅两个方法:一个是代码的方式作为中介数据,一个是UI的重构。

至于UI的重构,愚在验证原因的时候已经进行过一些操作,各位可以再进行其它的一些尝试,此处仅说明一下使用代码作为中介数据。

经验证使用中介数据的方法是有效的,愚在VM中申明horizontal,

        [ObservableProperty]
        private string horizontal= "Right";

TextBlock的HorizontalAlignment绑定如下(ViewModel申明在xaml中或后台代码中)

HorizontalAlignment="{x:Bind ViewModel.Horizontal, Mode=TwoWay}"

然后再在Canvas中子控件绑定如下:

 HorizontalAlignment="{x:Bind ViewModel.Horizontal, Mode=OneWay}"

总结

对于本次问题,AI给出的原因并不正确,但给出的解决方案是有效的,至于产生XamlParseException的原因,后续弄清楚了,再做补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 的工作原理

我们已经学习了CSS的基础知识,它的用途以及如何编写简单的样式表。在本课中,我们将了解浏览器如何获取 CSS 和 HTML 并将其转换为网页。 先决条件:已安装基本软件,了解处理文件的基本知识以及 HTML 基础知识(学习 HTML 简介。目的:要了解浏览器如何解析 CSS 和 HTML 的基…

pytorch前馈神经网络--手写数字识别

前言 具体内容就是&#xff1a; 输入一个图像&#xff0c;经过神经网络后&#xff0c;识别为一个数字。从而实现图像的分类。 资源&#xff1a; https://download.csdn.net/download/fengzhongye51460/89578965 思路&#xff1a; 确定输入的图像&#xff1a;会单通道灰度的…

即时战略游戏:帝国时代2 for Mac 3.3.1769 中文移植版

帝国时代II蛮王崛起是一款非常经典的即时战略游戏&#xff0c;新的地图&#xff0c;四个新战役&#xff0c;新的AI进行整合。帝国时代2玩家将要探索来自“国王时代”和“征服者”扩张的所有原始单人游戏&#xff0c;选择跨越一千年历史的18个文明&#xff0c;并在线上挑战其他玩…

17 敏捷开发—Scrum(2)

从上一篇 「16 敏捷开发实践&#xff08;1&#xff09;」中了解了Scrum是一个用于开发和维护复杂产品的框架&#xff0c;是一个增量的、迭代的开发过程。一般由多个Sprint&#xff08;迭代冲刺&#xff09;组成&#xff0c;每个Sprint长度一般为2-4周。下面全面介绍Scrumde 角色…

2024第29届郑州全国商品交易会

第29届郑州全国商品交易会 2024第四届餐饮与供应链专题展 邀 请 函郑州全国商品交易会&#xff08;简称郑交会&#xff09;是全国大型性经贸活动&#xff0c;一直秉承“政府指导&#xff0c;市场化运作”的模式&#xff0c;自1995年以来已成功举办了二十八届&#xff0c;是国内…

k8s多集群管理工具kubecm

文章目录 一、概述二、安装1、官网链接2、各平台安装2.1、MacOS2.2、Linux2.3、Windows 三、实例1、验证2、配置kubecm自动补全&#xff08;选做&#xff09;2.1、Bash2.2、Zsh2.3、fish2.4、PowerShell 3、创建存放kubeconfig文件的目录4、添加到 $HOME/.kube/config4.1、kube…

Pytorch笔记1

建议点赞收藏关注&#xff01;持续更新至pytorch大部分内容更完。 整体框架如下 目录 gpu加速数据数据结构张量TensorVariable 预处理数据增强 模型构建模块组织复杂网络初始化网络参数定义网络层 损失函数创建损失函数设置损失函数超参数选择损失函数 优化器管理模型参数管理…

JavaWeb学习——请求响应、分层解耦

目录 一、请求响应学习 1、请求 简单参数 实体参数 数组集合参数 日期参数 Json参数 路径参数 总结 2、响应 ResponseBody&统一响应结果 二、分层解耦 1、三层架构 三层架构含义 架构划分 2、分层解耦 引入概念 容器认识 3、IOC&DI入门 4、IOC详解 …

SSM学习9:SpringBoot简介、创建项目、配置文件、多环节配置

简介 SpringBoot式用来简化Spring应用的初始搭建以及开发过程的一个框架 项目搭建 File -> New -> Project 选中pom.xml文件&#xff0c;设置为maven项目 项目启动成功 可以访问BasicController中的路径 配置文件 在resources目录下 application.properties 默…

【初阶数据结构】8.二叉树(3)

文章目录 4.实现链式结构二叉树4.1 前中后序遍历4.1.1 遍历规则4.1.2 代码实现 4.2 结点个数以及高度等4.3 层序遍历4.4 判断是否为完全二叉树4.5层序遍历和判断是否为完全二叉树完整代码 4.实现链式结构二叉树 用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑关系…

巴斯勒相机(Basler) ACE2 dart 系列说明和软件

巴斯勒相机(Basler) ACE2 dart 系列说明和软件

NeuralGCM:革新气候预测的机器学习新纪元

在地球变暖成为全球关注焦点的今天&#xff0c;精确预测气候变化及其影响成为了科学界亟待解决的重大课题。传统基于物理的气候模型&#xff08;GCM&#xff0c;全球气候模型&#xff09;在预测大气、海洋、冰层等复杂系统时虽已取得显著进展&#xff0c;但计算成本高、耗时长且…

系统模块时序图的重要性:解锁系统模块交互的全景视图

在复杂的系统开发中,理解和管理不同模块之间的交互是成功的关键。时序图是一种有效的工具,可以帮助我们清晰地展示这些交互,提升设计和开发的效率。本文将深入探讨系统模块之间的时序图,并通过实例展示其实际应用。 1. 什么是系统模块之间的时序图? 系统模块之间的时序图…

Eclipse 生成 jar 包

打开 Jar 文件向导 Jar 文件向导可用于将项目导出为可运行的 jar 包。 打开向导的步骤为: 在 Package Explorer 中选择你要导出的项目内容。如果你要导出项目中所有的类和资源&#xff0c;只需选择整个项目即可。点击 File 菜单并选择 Export。在输入框中输入"JAR"…

Robot Operating System——Parameter设置的预处理、校验和成功回调

大纲 预处理校验成功回调完整代码测试总结 在《Robot Operating System——对Parameter设置进行校验》一文中&#xff0c;我们通过Node的add_on_set_parameters_callback方法&#xff0c;设置了一个回调函数&#xff0c;用于校验传递过来的Parameter参数。但是这个方法并不能对…

【UbuntuDebian安装Nginx】在线安装Nginx

云计算&#xff1a;腾讯云轻量服务器 操作系统&#xff1a;Ubuntu-v22 1.更新系统软件包列表 打开终端并运行以下命令来确保你的系统软件包列表是最新的&#xff1a; sudo apt update2.安装 Nginx 使用以下命令安装 Nginx&#xff1a; sudo apt install nginx3.启动 Nginx…

基于python的BP神经网络回归模型

1 导入必要的库 import pandas as pd from sklearn.model_selection import train_test_split, cross_val_score, KFold import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score …

电脑如何进行录屏?电脑录屏无压力!

在数字时代&#xff0c;屏幕录制已成为我们日常生活和工作中不可或缺的一部分。无论你是想要制作教程、记录游戏过程&#xff0c;还是捕捉在线会议的精彩瞬间&#xff0c;掌握屏幕录制的方法都显得尤为重要。本文将为你详细介绍电脑如何进行录屏&#xff0c;帮助你轻松捕捉屏幕…

音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

科技核心 电力方向

【电力投资】电力体制改革***电量投资风险控制研究 【配电网管理】基于***配电网线损数据精细化管理研究 【电价优化】基于***能源系统电价优化模型研究 【电力营销】基于***电力营销业务数据***