- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 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
。
如果我误解了你,我深表歉意,但如果我误解了,也许你可以进一步解释(在对你的问题的编辑中)以上代码的用途。您不需要使用这样的代码,而是能够直接从控件内部 Bind
到 Items
属性。
关于c# - 两个单独的 UserControls 似乎是同一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19922200/
您好,我的 WPF UserControl 知识只有一个小时了。因此,如果有很多关于这个问题的教程或/和答案,请原谅我(老实说,我认为这无法完成,需要重新编写代码……因此我想问的原因) 因此,在创建
我看过几篇文章介绍如何删除在运行时添加的 UserControl,但我的问题有点不同。我有一个 UserControl,它由一个图像组成,右上角有一个小“x”按钮,用于从其父 Canvas 中删除自身
我有一个用户控件 UserControl1,它在其资源中定义了一种样式。该用户控件包含一个 UserControl2 实例,它引用了该样式:
我正在尝试以 How can a WPF UserControl inherit a WPF UserControl? 中提到的方式继承 WPF 中的用户控件 namespace DMS.Presen
我想创建几个具有一些通用功能的 WPF UserControl 类。出于这个原因,我想从一个新的基类派生类,而这个基类又派生自 UserControl。 我的问题是我的 C# 类是 部分 定义的,而自
这个问题在这里已经有了答案: Should a user control have its own view model? (6 个答案) How to correctly bind to a de
我有一个 UserControl,它包含另一个带有 Button 的 UserControl。我想在第一个 UserControl(父级)中向该按钮添加一个事件。我尝试这样做: void Page_I
我需要我所有的用户控件都具有一些类似的功能。所以我的用户控件是: using System.Windows.Controls; namespace WpfApplication26 { ///
以下 WPF UserControl 调用了 DataTypeWholeNumber,它有效。 现在我想创建一个名为 DataTypeDateTime 和 DataTypeEmail 等的 UserC
我有一个包含按钮和其他一些控件的 UserControl: ... 当我创建该控件的新实例时,我想获取 Button 的 Command 属性: 当然,“Th
我不确定这个问题是否已经发布,并且我已经检查了建议的 SO 链接,但似乎没有一个链接与该问题完全相关。因此,如果有人认为这可能是重复的,请发布建议答案的链接并原谅这篇文章。 解决我的问题的方法可能不止
我在 UserControl_1 中有两个 UserControl,有一个按钮可以在 MainWindow.axml 中的 StackPanel 中添加 UserControl_2。我在 UserCo
我正在开发一个由多个传感器组成的模块化项目,每个传感器都继承自一个抽象的 Sensor 类。为了配置每个传感器,我已经开始为每个传感器添加一个用户控制面板(继承自 UserControl),它在运行时
我正在使用 c#.net 我的网络表单中有不同的 View ,除了三个文本框(到达/看到/离开时间)之外,这些通常都显示不同的信息。为了尝试减少代码,我创建了一个包含这三个文本框的 UserContr
我有一个 UserControl,它有两个组件 public System.Windows.Forms.ComboBox innerComboBox; public System.Windows.Fo
我有一个包含 ListBox 的 userControl。我想从另一个 userControl 访问那个 ListBox。 例如: UserControl1.ListBox1.Items.Count;
我在更新另一个用户控件中的用户控件时遇到问题。 示例代码: UserControl MyCart1 = (UserControl)Page.FindControl("MyCart1"); Update
我在下面添加了一些屏幕截图和重现步骤。 我的数据模型有一个基类,我们称它为 CommonThing,它有很多属性。然后有几个具有附加属性的此类的特殊版本。我现在想创建一个 UI 来将数据输入到这个模型
我有一个应用程序,我需要确保在使用 ShowDialog() 单击用户控件上的按钮打开的表单将在我处理用户控件时关闭和处理。 我通过计时器在主窗体中调用 userControl.Dispose()。
我正在努力实现... 用户控件(MyRepeater) Control Start Control End 页面 Page Start Page Item Tem
我是一名优秀的程序员,十分优秀!