【发布时间】:2013-11-12 06:13:53
【问题描述】:
我在使用 WPF 中的用户控件时遇到问题。
我有一个窗口,在这个窗口内我有一个自定义菜单 (UserControl)。在这个菜单中,我有三个自定义按钮。在窗口中,我还有一个 ContentControl,用于显示我正在使用的其他 UserControls 类似页面。这些按钮用于选择要显示的页面。
代码:
<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 的项目放入 WrapPanel 以显示它时,CustomMenu.xaml.cs 中会引发异常。
代码:
foreach (FrameworkElement item in Items)
{
myWrapPanel.Children.Add(item); // Exception here
}
例外是:“指定元素已经是另一个元素的逻辑子元素。先断开它。”
所以我调试了它,令我惊讶的是,选项页面内的 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
这是我的 items 属性的定义,在 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>()));
【问题讨论】:
标签: c# wpf xaml user-controls instance