c# - 两个单独的 UserControls 似乎是同一个实例

标签 c# wpf xaml user-controls instance

我在使用 WPF 中的用户控件时遇到问题。

我有一个窗口,在这个窗口内我有一个自定义菜单 (UserControl)。在这个菜单中,我有三个 CustomButtons。在窗口中,我还有一个 ContentControl,用于显示我正在使用的其他 UserControl,如页面。这些按钮用于选择要显示的页面。

代码:

<Local:CustomMenu x:Name="mainMenu" Margin="10,42,0,0" Height="39" VerticalAlignment="Top">
    <Local:CustomMenu.Items>
        <Local:CustomButton Text="Home" TextColor="Black" Click="cbHome_Click" />
        <Local:CustomButton Text="Users" TextColor="Black" Click="cbUsers_Click" />
        <Local:CustomButton Text="Options" TextColor="Black" Click="cbOptions_Click" />
    </Local:CustomMenu.Items>
</Local:CustomMenu >

<ContentControl x:Name="cControl" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="0,81,0,0" />

点击示例:

private void cbOptions_Click(CustomButton arg1, RoutedEventArgs arg2)
{
    cControl.Content = new Options();
}

进入“选项”页面,我有另一个 CustomMenu 和四个 CustomButtons,还有一个 ContentControl,就像一个子页面选择。

问题从这里开始。当我选择“选项”页面时,当我将 CustomMenu 的项目放入 WrapPanel 中以显示它时,CustomMenu.xaml.cs 中会引发异常。

代码:

foreach (FrameworkElement item in Items)
{
    myWrapPanel.Children.Add(item); // Exception here
}

异常(exception)是:“指定的元素已经是另一个元素的逻辑子元素。先断开它。”

所以我调试了它,令我惊讶的是,选项页面中的 CustomMenu 有 7 个项目,而不是预期的 4 个项目。

但是如果我只添加四个项目呢?三个额外的项目是对主窗口前三个按钮的引用,这就是引发此异常的原因。

这怎么可能?抱歉,如果不清楚。

选项页面代码:

<Local:CustomMenu x:Name="optionsMenu" Margin="10,42,0,0" Height="39" VerticalAlignment="Top">
    <Local:CustomMenu.Items>
        <Local:CustomButton Text="test" TextColor="Black" />
        <Local:CustomButton Text="test" TextColor="Black" />
        <Local:CustomButton Text="test" TextColor="Black" />
        <Local:CustomButton Text="test" TextColor="Black" />
    </Local:CustomMenu.Items>
</Local:CustomMenu >

<ContentControl x:Name="cControl" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Margin="0,81,0,0" />

编辑

强制将按钮放置到 CustomMenu 中,使用以下代码,只会导致更奇怪的行为:

foreach (FrameworkElement item in Items)
{
    try 
    {
        myWrapPanel.Children.Add(item); 
    } 
    catch { }
}

结果是:MainWindow 的 CustomMenu 有 0 个项目(所有项目都消失了),OptionsPage 中的 CustomMenu 有正确的 4 个项目(至少)。

编辑 2

这是我的项目属性的定义,在 CustomMenu.xaml.cs 中:

public ObservableCollection<UIElement> Items
{
    get { return (ObservableCollection<UIElement>)GetValue(ItemsProperty); }
    set { SetValue(ItemsProperty, value); }
}

public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(ObservableCollection<UIElement>),
typeof(CustomMenu), new PropertyMetadata(new ObservableCollection<UIElement>()));

最佳答案

我不能说为什么您在 CustomMenu 中看到七个项目,而不是您提供的信息中的四个项目。这一切听起来很奇怪。但是,您的问题是由以下代码引起的...:

foreach (FrameworkElement item in Items)
{
    myWrapPanel.Children.Add(item); // Exception here
}

... 是因为,如错误所述,指定的元素已经是另一个元素的逻辑子元素。在 WPF 中,UI 元素只能在标记中出现一次,因此该错误意味着您无法将 Items 集合中的 UI 项添加到另一个 UI 容器控件中。更简单地说,您不能同时在多个地方展示相同的项目。我无法准确判断,因为我们还没有看到您的 CustomMenu 控件的定义。

您可以将它们从一个容器移到另一个容器,但我不明白您为什么要尝试这样做。在 WPF 中,我们通常操作的是数据,而不是 UI。因此,“复制 UI 元素”的 WPF 方法是提供 DataTemplate 来定义 UI,然后复制数据对象或仅使用 Binding

如果我误解了你,我深表歉意,但如果我误解了,也许你可以进一步解释(在对你的问题的编辑中)以上代码的用途。您不需要使用这样的代码,而是能够直接从控件内部 BindItems 属性。

关于c# - 两个单独的 UserControls 似乎是同一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19922200/

相关文章:

wpf - 并排运行 WPF/Win32 应用程序的性能问题?

c# - 用Catel关闭窗口

c# - 我是否需要持有至少 1 个 View 模型来处理我的所有 View ?

c# - Framework.Triggers 和 Style.Triggers 之间的区别?

wpf - 使用模板化菜单项关闭 ContextMenu

c# - 如何在Watin等候回邮?

c# - LINQ 仅当其中一个字段是特定值时才对多个字段进行分组

c# - 在 DataGrid、Silverlight 导航应用程序中选择整行

c# - 从 API 中的引用 token 获取用户 ID

C# 调用一个函数?