尝试使用标记扩展时出错

本文关键字:扩展 出错 | 更新日期: 2023-09-27 18:34:52

我有一个小窗口,当我的应用程序启动时,我正在尝试加载它。下面是(松散的(XAML:

<ctrl:MainWindow
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ctrl="clr-namespace:Controls;assembly=Controls">
<Grid>
    <ctrl:ConnectionStatusIndicator/>
    <TextBlock Grid.Row="2" Text="{Resx ResxName=MyApp.MainDialog, Key=MyLabel}"/>
</Grid>
</ctrl:MainWindow>

请注意名为 ConnectionStatusIndicator 的自定义控件。它的代码是:

using System.Windows;
using System.Windows.Controls;
namespace Controls
{
    public class ConnectionStatusIndicator : Control
    {
        public ConnectionStatusIndicator()
        {
        }
        static ConnectionStatusIndicator()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ConnectionStatusIndicator),
                                                     new FrameworkPropertyMetadata(typeof(ConnectionStatusIndicator)));
            IsConnectedProperty = DependencyProperty.Register("IsConnected", typeof(bool), typeof(ConnectionStatusIndicator), new FrameworkPropertyMetadata(false));
        }
        public bool IsConnected
        {
            set { SetValue(IsConnectedProperty, value); }
            get { return (bool)GetValue(IsConnectedProperty); }
        }
        private static DependencyProperty IsConnectedProperty;
    }
}

现在,这就是它变得奇怪的地方(至少对我来说(。使用上面显示的 XAML,我的应用程序将生成并正常运行。但是,如果我删除以下行:

<ctrl:ConnectionStatusIndicator/>

或事件将其向下移动一行,我收到以下错误:

附加信息:"无法创建未知类型 "{http://schemas.microsoft.com/winfx/2006/xaml/presentation}Resx'." 行号"13"和行位置"33"。

对我来说真正奇怪的是,如果我将 ConnectionStatusIndicator 替换为来自同一程序集的另一个自定义控件,则会出现错误。另一个自定义控件非常相似,但具有更多属性。

谁能解释一下这里发生了什么?

尝试使用标记扩展时出错

Resx标记扩展属于 Infralution.Localization.Wpf 命名空间,但也做了一些有点黑客的事情,并尝试将自身注册到 http://schemas.microsoft.com/winfx/2006/xaml/presentation xml 命名空间以允许开发人员将其用作{Resx ...},而不必在 XAML 中声明命名空间并使用带有前缀的扩展{resxNs:Resx ...}

我相信,如果您清理解决方案并可能删除 *.sou 文件,项目将按预期构建,但解决此问题的可靠方法是为 Infralution.Localization.Wpf 添加一个 xmlns 声明并使用带有 xmlns 前缀的扩展名:

<ctrl:MainWindow
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ctrl="clr-namespace:Controls;assembly=Controls"
    xmlns:loc="clr-namespace:Infralution.Localization.Wpf;assembly=Infralution.Localization.Wpf">
    <Grid>
        <ctrl:ConnectionStatusIndicator/>
        <TextBlock Grid.Row="2" Text="{loc:Resx ResxName=MyApp.MainDialog, Key=MyLabel}"/>
    </Grid>
</ctrl:MainWindow>

此外,对于任何感兴趣的人,"hack"在本地化库中的以下行中:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Infralution.Localization.Wpf")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2007/xaml/presentation", "Infralution.Localization.Wpf")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2008/xaml/presentation", "Infralution.Localization.Wpf")]