我创建了一个包含两个项目的用户控件:一个按钮和一个菜单。下面的代码是一个非常简化的版本,仍然存在相同的问题(我将在下面提到)。
<UserControl x:Class="gemsTouchLensApplication.Controls.ButtonAndMenu"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<StackPanel Orientation="Horizontal">
<Button/>
<Menu/>
</StackPanel>
</UserControl>
我希望能够使用此usercontrol执行两项操作:向菜单添加项目并设置按钮的内容。
我希望能够以传统方式将菜单添加到菜单中
<Menu>
<MenuItem Header="1"/>
<MenuItem Header="2"/>
<MenuItem Header="3"/>
<MenuItem Header="4"/>
<MenuItem Header="5"/>
etc...
</Menu>
但是,当我将usercontrol添加到stackpanel
后尝试执行此操作时<Window>
<StackPanel>
<cntrls:ButtonAndMenu>
<MenuItem Header="1"/>
<MenuItem Header="2"/> <!--Comment this out and the error disappears-->
</cntrls:ButtonAndMenu>
</StackPanel>
</Window>
发生意外的事情。我只能向usercontrol添加一个项目。如果我添加了多个项目,我会收到错误:
属性'内容'只能设置一次。
当只添加一个项目时,视觉控件更接近按钮,而不是菜单。
我怀疑通过向用户控件添加控件,WPF引擎默认设置按钮的内容,而不是将控件添加到菜单中。
如何修改usercontrol以便消费者可以:
答案 0 :(得分:1)
了解如何做到这一点。
我创建了一个名为MenuItems的依赖项属性,并将菜单的项源绑定到该属性。我还必须在我的用户控件的类上设置一个属性。
[ContentProperty("MenuItems")]
public partial class ButtonAndMenu: UserControl
{
public ObservableCollection<DependencyObject> MenuItems
{
get { return (ObservableCollection<DependencyObject>)GetValue(MenuItemsProperty); }
set { SetValue(MenuItemsProperty, value); }
}
internal static readonly DependencyProperty MenuItemsProperty = DependencyProperty.Register(
"MenuItems", typeof(ObservableCollection<DependencyObject>), typeof(ButtonAndMenu),
new FrameworkPropertyMetadata(new ObservableCollection<DependencyObject>()));
}
并且XAML变为:
<UserControl x:Class="gemsTouchLensApplication.Controls.ButtonAndMenu"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
x:Name="root">
<StackPanel Orientation="Horizontal">
<Button/>
<Menu ItemsSource={Binding ElementName=root, Path=MenuItems}/>
</StackPanel>
</UserControl>
然后,在主窗口中,我可以执行以下操作:
<Window>
<StackPanel>
<cntrls:ButtonAndMenu>
<MenuItem Header="1"/>
<MenuItem Header="2"/>
<MenuItem Header="3"/>
<!--etc... You can keep adding items here-->
</cntrls:ButtonAndMenu>
</StackPanel>
</Window>
所以,总结一下:
答案 1 :(得分:0)
因为MenuItem
来自ItemsControl
,但UserControl
是ContentControl
。您必须将ButtonAndMenu
设为ItemsControl
。你为什么不做自定义MenuItemControl?
编辑:
此链接可能会有所帮助。
1)Creating and consuming a custom WPF control。此演示展示了如何自定义ListBox
到ColorPickerControl1
。
您可以对MenuItemControl使用相同的概念。
您将不再使用UserControl,您的CustomControl将如下所示。您需要研究如何在WPF中进行自定义控件。
public class MyMenuItem : MenuItem
{
// add your custom work here
}