3

我有一个小窗口,我试图在我的应用程序启动时加载它。这是(松散的)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,我会收到错误消息。另一个自定义控件非常相似,但具有更多属性。

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

4

1 回答 1

1

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

我相信,如果您清理您的解决方案并可能删除您的 *.sou 文件,该项目将按预期构建,但解决此问题的可靠方法是添加xmlns声明 Infralution.Localization.Wpf并使用带有 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")]
于 2013-10-10T20:27:29.727 回答