0

我可以在我的主项目中成功添加在我的 Assets 程序集中定义的控件。

例如,像这样的控件:

using System.Windows.Controls;
namespace AdvancedAudioGui.Assets.Controls
{
    public class MyControl: Control
    {
        public string MyProperty { get; set; }
    }
}

像这样工作:

<UserControl x:Class="MyCompanyName.AdvancedAudioGui.Parts.MyPart"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:controls="clr-namespace:AdvancedAudioGui.Assets.Controls;assembly=AdvancedAudioGui.Assets"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
        <controls:MyControl />
</Grid>

但不是这样(注意:名称或事件处理程序(如 MouseDown)也会发生同样的事情):

<UserControl x:Class="MyCompanyName.AdvancedAudioGui.Parts.MyPart"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:controls="clr-namespace:AdvancedAudioGui.Assets.Controls;assembly=AdvancedAudioGui.Assets"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
        <controls:MyControl x:Name="MyInstance"/>
</Grid>

我得到错误:

命名空间“OurCompanyName.AdvancedAudioGui”中不存在类型或命名空间名称“Assets”(您是否缺少程序集引用?)

如果我在后面的代码中创建它们,我可以添加一个名称,所以它一定是一个 xmlns 问题,但我看不到它。有任何想法吗?

谢谢!

4

1 回答 1

1

哇,所以我终于想通了。希望它能帮助那些不幸遇到同样问题的人。

旧命名空间如下:

主项目命名空间:CompanyName.AdvancedAudioGui

assets 项目命名空间:AdvancedAudioGui.Assets

当我在资产项目中定义的主项目中的控件实例上添加 x:Name 属性时,它将失败并出现错误:

命名空间“OurCompanyName.AdvancedAudioGui”中不存在类型或命名空间名称“Assets”(您是否缺少程序集引用?)

当我更改资产项目中的命名空间以更紧密地匹配主项目时,错误消失了。

新的命名空间如下:

主项目命名空间:CompanyName.AdvancedAudioGui(与之前相同)

资产项目:CompanyName.AdvancedAudioGui.Assets

无论如何,后一种方式更可取,但似乎资产命名空间是主项目命名空间的一个子集,当它试图解析 xaml 命名空间时,它会以某种方式混淆编译器。

也许有人知道为什么会这样……?

于 2013-07-02T22:51:04.007 回答