You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清除WPF项目中VS报错XDG0010:‘...不是属性Page的有效值’

解决WPF自定义控件XDG0010错误的方案

问题根源

你的btnNav控件中,依赖属性PageProperty注册的类型是Page,但CLR属性却用了dynamic类型,这导致VS的XAML编译器/设计器无法正确识别类型匹配,从而抛出XDG0010错误。虽然运行时dynamic能兼容,但这违反了WPF依赖属性的规范,必须修正CLR属性的类型。

步骤1:修正CLR属性类型(必须操作)

把CLR属性改回与依赖属性一致的Page类型,同时注意对GetValue的返回值做强制类型转换(因为GetValue默认返回object):

using System.Windows.Controls; // 确保引用正确的Page命名空间

public static readonly DependencyProperty PageProperty = DependencyProperty.Register(
    "Page", typeof(Page), typeof(btnNav), new PropertyMetadata(null));

// 替换dynamic为Page类型,添加强制转换
public Page Page
{
    get { return (Page)GetValue(PageProperty); }
    set { SetValue(PageProperty, value); }
}

步骤2:排查“改成Page类型后编译失败”的原因

你提到改成Page类型后编译失败,大概率是以下原因之一:

  • 命名空间冲突:确保代码中引用的Page是System.Windows.Controls.Page,而非其他命名空间(比如错误提示里的Microsoft.VisualStudio.XSurface.Wpf.Page)。检查代码文件顶部的using语句,避免引入冲突的命名空间。
  • 页面类型不兼容:确认UiTheme页面确实继承自System.Windows.Controls.Page,其代码定义应为:
    public partial class UiTheme : Page
    {
        public UiTheme()
        {
            InitializeComponent();
        }
    }
    
  • 关联代码未同步修改:检查项目中所有使用btnNav.Page的地方(比如导航事件处理方法),原来依赖dynamic的代码要同步改为Page类型,例如:
    private void _Nav_Click(object sender, RoutedEventArgs e)
    {
        var navBtn = sender as btnNav;
        if (navBtn?.Page != null)
        {
            // 示例:用Frame导航到目标页面
            yourFrameControl.Navigate(navBtn.Page);
        }
    }
    

为什么这样能解决XDG0010错误

WPF依赖属性要求CLR包装器的类型必须与注册的依赖属性类型严格一致,这是官方规范。使用dynamic会绕过编译时类型检查,导致VS的XAML设计器无法解析属性的正确类型,从而抛出错误。修正CLR属性类型后,类型匹配问题解决,错误自然消失。

内容的提问来源于stack exchange,提问作者Mandelbrotter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:30:23