gpt4 book ai didi

c# - 将项目添加到用户控件中的菜单

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:15 25 4
gpt4 key购买 nike

我创建了一个包含两个项目的用户控件:一个按钮和一个菜单。下面的代码是一个可怕的简化版本,但仍然存在相同的问题(我将在下面提到)。

<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>

我希望能够用这个用户控件做两件事:将项目添加到菜单并设置按钮的内容。

我希望能够以常规方式将项目添加到菜单

<Menu>
<MenuItem Header="1"/>
<MenuItem Header="2"/>
<MenuItem Header="3"/>
<MenuItem Header="4"/>
<MenuItem Header="5"/>
etc...
</Menu>

但是,当我在将用户控件添加到堆栈面板后尝试执行此操作时

<Window>
<StackPanel>
<cntrls:ButtonAndMenu>
<MenuItem Header="1"/>
<MenuItem Header="2"/> <!--Comment this out and the error disappears-->
</cntrls:ButtonAndMenu>
</StackPanel>
</Window>

意想不到的事情发生了。我只能向用户控件添加一个项目。如果我添加了不止一项,我会收到错误消息:

属性“Content”只能设置一次。

当只添加一个项目时,控件的视觉效果更接近于按钮,而不是菜单。

我怀疑通过向 usercontrol 添加控件,WPF 引擎默认设置按钮的内容,而不是将控件添加到菜单。

如何修改用户控件以便消费者可以:

  1. 使用常规符号将项目添加到菜单
  2. 还是设置按钮的内容

最佳答案

了解如何去做。

我创建了一个名为 MenuItems 的依赖属性,并将菜单的项目源绑定(bind)到它。我还必须在我的用户控件类上设置一个属性。

[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. 创建一个作为集合的依赖属性
  2. 将类的 ContentProperty 属性设置为该依赖属性
  3. 将菜单的 ItemsSource 绑定(bind)到该属性

关于c# - 将项目添加到用户控件中的菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14871180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com