0

我试图模仿我继承的一些代码,并创建一个 WPF UserControl 使用同一库中的另一个 UserControl。

我创建了一个全新的项目,它是一个用户控件库。该库称为 MyLib。它在文件 UserControl1.xaml 中包含一个简单的 UserControl

<UserControl x:Class="MyLib.UserControl1"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
      <TextBlock>Hello</TextBlock>
    </Grid>
</UserControl>

然后我创建了另一个 UserControl(在同一个库/项目中),它将使用 UserControl1 作为它的一部分:

<UserControl x:Class="MyLib.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:lib="clr-namespace:MyLib"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
  <Grid>
    <lib:UserControl1 />
  </Grid>
</UserControl>

我收到一条错误消息:

xmlns:lib="clr-namespace:MyLib"

说“必须为不属于项目的 XAML 文件指定错误 2 程序集。将其添加到项目后重新打开此 XAML 文件,关闭此文件并使用与之关联的项目重新打开它,或修改 clr 命名空间包括程序集的名称。”

但奇怪的是,当我添加该行时,我会自动完成:

<lib:UserControl1 />

我偶尔也会遇到奇怪的错误:

错误 1 ​​未知的构建错误,“对象引用未设置为对象的实例。” 我的库

我可以在单独的项目(相同的解决方案,添加到 MyLib 的引用)中使用 UserControl1,如下所示:

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:lib="clr-namespace:MyLib;assembly=MyLib"
        Title="MainWindow" Height="350" Width="525">
  <Grid>
    <lib:UserControl1 />
  </Grid>
</Window>

作为健全性检查,我的 UserControl2 应该工作吗?自从我使用 WPF UserControls 以来已经有一段时间了,所以我想知道我是否在做一些愚蠢的事情。

更新 在新机器上全新安装 Windows 和 Studio 时复制。

4

3 回答 3

1

这需要大量的实验,但我找到了一些东西。如果您从头开始一个项目,我的原始示例将起作用,并完全按照所示输入内容。

当我在 UserControl 中引入一个错误时,事情出轨了,该错误引发了一个在幕后被吞没的异常(使用空字符串而不是空字符串)。似乎为设计时显示编译的 Visual Studio 变得古怪且与源代码不同步,产生与源代码不匹配的看起来怪异的错误。

解决方案是删除导致错误的代码,保存并关闭解决方案。然后重新加载它。这似乎在显示时间和真正的构建过程之间进行了同步。只要在 Visual Studio 的会话期间发生(静默)错误,在重新加载项目之前,事情就会一直令人毛骨悚然。

一个重要技巧:使用 try-catch 保护 UserControls 属性的代码隐藏块,尤其是在尝试诊断此类问题时。

于 2013-04-01T20:04:31.477 回答
0

尝试

xmlns:lib="clr-namespace:MyLib;assembly=MyLib"
于 2013-03-31T15:22:52.317 回答
0

通常在这种情况下,我会确保首先构建项目。然后您将在您的工具箱中获得可用的用户控件,然后您可以将其拖放到UserControl您要托管的另一个上UserControl,并让 Visual Studio 找出名称空间。我没有你的代码,但使用 MyLib 的命名空间它想出了:

xmlns:my="clr-namespace:myLib"
于 2013-03-31T16:11:17.977 回答