将用户控件添加到项目时出现 XamlParseException
XamlParseException when adding a usercontrol into a project
我在一个项目中创建了一个用户控件,它只包含一个 MainWindow.xaml 和后面的代码。我将.dll添加到VS的工具箱中,并将其拖放到新项目中的window中。这创建了以下内容:
<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
只是控件中的 public class,但不是我想要显示的内容。我想显示用户控件的主要 window(不是 window),但在键入 <ThinkGeoClean:
后它没有显示为选项。唯一出现的是 ListBoxCustom
。如果我继续键入 <ThinkGeoClean.MainWindow>
,它会在该行给出 XamlParseException 错误。
现在,如果我进入代码隐藏并执行以下操作:
ThinkGeoClean.MainWindow newWin = new ThinkGeoClean.MainWindow();
newWin.Show();
它会在一个新的 window 中弹出用户控件并且它工作正常。
下面是usercontrol代码的开头:
namespace ThinkGeoClean
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
而 xaml 因为它只是一个包含一些按钮和地图控件的网格。
编辑:除了下面的答案,我的用户控件最初只是一个普通的 WPF 项目。我认为将输出类型更改为 class 库会自动将其更改为用户控件,但实际上我不得不进入 xaml 并将 the 更改为 .
这个XAML:
<Grid>
<ThinkGeoClean:ListBoxCustom x:Name="listBoxCustom" />
</Grid>
... 不是 等同于创建 window 的实例并以编程方式对其调用 Show()
方法。
相反,XAML 处理器将尝试将 window 添加到 Grid
的 Children
集合中,这是不可能的,因为 window不能是另一个控件的子控件。这就是你得到异常的原因。
此外,UserControl
必须托管在 window 或页面中。不是没有父宿主也能显示的顶级控件。
我在一个项目中创建了一个用户控件,它只包含一个 MainWindow.xaml 和后面的代码。我将.dll添加到VS的工具箱中,并将其拖放到新项目中的window中。这创建了以下内容:
<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
只是控件中的 public class,但不是我想要显示的内容。我想显示用户控件的主要 window(不是 window),但在键入 <ThinkGeoClean:
后它没有显示为选项。唯一出现的是 ListBoxCustom
。如果我继续键入 <ThinkGeoClean.MainWindow>
,它会在该行给出 XamlParseException 错误。
现在,如果我进入代码隐藏并执行以下操作:
ThinkGeoClean.MainWindow newWin = new ThinkGeoClean.MainWindow();
newWin.Show();
它会在一个新的 window 中弹出用户控件并且它工作正常。
下面是usercontrol代码的开头:
namespace ThinkGeoClean
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
而 xaml 因为它只是一个包含一些按钮和地图控件的网格。
编辑:除了下面的答案,我的用户控件最初只是一个普通的 WPF 项目。我认为将输出类型更改为 class 库会自动将其更改为用户控件,但实际上我不得不进入 xaml 并将 the 更改为 .
这个XAML:
<Grid>
<ThinkGeoClean:ListBoxCustom x:Name="listBoxCustom" />
</Grid>
... 不是 等同于创建 window 的实例并以编程方式对其调用 Show()
方法。
相反,XAML 处理器将尝试将 window 添加到 Grid
的 Children
集合中,这是不可能的,因为 window不能是另一个控件的子控件。这就是你得到异常的原因。
此外,UserControl
必须托管在 window 或页面中。不是没有父宿主也能显示的顶级控件。