【问题标题】:XamlParseException when adding a usercontrol into a project将用户控件添加到项目中时出现 XamlParseException
【发布时间】:2018-01-08 16:06:47
【问题描述】:

我在一个项目中创建了一个用户控件,该控件仅包含一个 MainWindow.xaml 和后面的代码。我将 .dll 添加到 VS 的工具箱中,并将其拖放到新项目的窗口中。这创建了以下内容:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication5"
        xmlns:ThinkGeoClean="clr-namespace:ThinkGeoClean;assembly=ThinkGeoClean" x:Class="WpfApplication5.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" >
    <Grid>
        <ThinkGeoClean:ListBoxCustom x:Name="listBoxCustom" />
    </Grid>
</Window>

ThinkGeoClean 是我添加的 .dll 的名称,它是用户控件。 ListBoxCustom 只是控件中的一个公共类,但不是我想要展示的。我想显示用户控件的主窗口(不是窗口),但在输入&lt;ThinkGeoClean: 后它没有显示为选项。唯一出现的是ListBoxCustom。如果我继续输入&lt;ThinkGeoClean.MainWindow&gt;,它会在该行给出 XamlParseException 错误。

现在,如果我进入代码隐藏并执行:

ThinkGeoClean.MainWindow newWin = new ThinkGeoClean.MainWindow();
newWin.Show();

它会在一个新窗口中弹出用户控件,它工作正常。

下面是用户控件代码的开头:

namespace ThinkGeoClean
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {

它的 xaml 只是一个包含一些按钮和地图控件的网格。

编辑:除了下面的答案,我的用户控件原本只是一个普通的 WPF 项目。我以为将输出类型更改为类库会自动将其更改为用户控件,但实际上我必须进入 xaml 并将其更改为。

【问题讨论】:

  • Xaml 不能显示窗口,如果可以的话,您可以从 xaml 弹出一个消息框。这是由于视觉树不接受 Window 作为孩子。它只能是父母。
  • 您是否正确添加了引用?!它会复制到您的构建位置吗?!
  • 射击。好的,我将尝试将控件更改为实际的 而不是 。我以为我可以将项目输出更改为“类库”,它会起作用,但猜不出来。谢谢!
  • 您是要使 ThinkGeoClean.MainWindow 成为 Xaml 中的根元素(例如,替换 Window),还是要使其成为 Window 的后代?前者应该是合法的,但后者不是。
  • 我试图让它成为后代。谢谢你。我必须回到控件并将窗口更改为用户控件。

标签: c# wpf xaml user-controls


【解决方案1】:

此 XAML:

<Grid>
    <ThinkGeoClean:ListBoxCustom x:Name="listBoxCustom" />
</Grid>

...相当于创建一个窗口实例并以编程方式对其调用Show() 方法。

相反,XAML 处理器将尝试将窗口添加到 GridChildren 集合中,这是不可能的,因为窗口不能是另一个控件的子控件。这就是你得到异常的原因。

此外,UserControl 必须托管在窗口或页面中。它不是没有任何父主机就可以显示的顶级控件。

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多