尝试使用标记扩展时出错
本文关键字:扩展 出错 | 更新日期: 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")]