【问题标题】:How to add UserControl to a Panel on a WPF Window如何将 UserControl 添加到 WPF 窗口上的面板
【发布时间】:2012-06-27 17:13:47
【问题描述】:

我想我在这里遗漏了一些应该很明显的东西,但我在这个上画了一个空白。

我构建了一个非常原始的 UserControl,其中只包含一个 TextBox 用作日志窗口:

<UserControl x:Class="My.LoggerControl"
             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"
             x:Name="LoggerView">
    <Grid x:Name="LayoutRoot">
        <TextBox x:Name="LogWindow" AcceptsReturn="True"/>
    </Grid>
</UserControl>

我不认为这是最好的方法,但对于原型来说应该已经足够了。

代码隐藏同样简单:

public partial class LoggerControl : UserControl, ILogger
{
    public LoggerControl()
    {
        InitializeComponent();
    }

    private LogLevel level = LogLevel.Warning;

    #region ILogger

    public LogLevel Level
    {
        get { return level; }
        set { level = value; }
    }

    public void OnError(string s)
    {
        if (level >= LogLevel.Error)
            LogWindow.AppendText("ERROR:::" + s + "\n");
    }

    // ...
    #endregion
}

我想不通的是如何将此控件添加到我的MainWindow.xaml。简化,假设我的窗口如下所示:

<Window x:Class="My.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:My"
    Title="Test" Height="350" Width="525">
    <Grid>
        <local:LoggerControl x:Name="LogView" />
    </Grid>
</Window>

即使如此简单,Visual Studio 2010 中的设计器也无法加载主窗口。给出的错误是:

“LoggerControl”类型的值不能添加到“UIElementCollection”类型的集合或字典中。

此错误消息在主要搜索引擎中只有一个不相关的命中(加上重复),所以我没有找到任何有用的帮助。微软自己的文档似乎暗示这应该可行。

知道如何解决这个问题吗?

【问题讨论】:

  • 奇怪的是,当我构建一个最小的测试应用程序时,我没有这个问题。什么可能导致这种情况?

标签: wpf xaml user-controls


【解决方案1】:
<UserControl x:Class="My.LoggerControl"


 xmlns:local="clr-namespace:My.LogTest"

您似乎在命名空间中犯了错误? LoggerControl 被列为命名空间 My,而您正在导入 My.LogTest 并将其分配给 xml-prefix 本地。将其更改为:

xmlns:local="clr-namespace:My"

而且我认为它应该有效。否则,修复 LoggerControl 声明。

【讨论】:

  • 很好看。不过,这是我复制代码并删除对雇主的引用的错误。我使用的命名空间是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多