【问题标题】:WPF - Creating a custom control with dynamic subcontrolsWPF - 使用动态子控件创建自定义控件
【发布时间】:2015-12-29 23:57:01
【问题描述】:

我正在尝试在 WPF 中创建一个菜单/导航控件,该控件将用于多个应用程序。该控件旨在驻留在自定义窗口中,并将提供最大化、最小化、关闭、拖动等功能。除了标准的“窗口”功能外,控件还应该包含应用程序的主“菜单”——本质上是一组按钮,每个按钮都与命令和/或视图模型相关联——这些按钮也是自定义控件(派生从单选按钮)。

基本上,我的目标是能够通过 XAML 以这样的方式添加此菜单控件及其按钮(这是伪代码,要清楚):

    <MenuControl Title="ApplicationTitle>
        <MenuControl.MenuButtons>
            <MenuButton Content="Button1" Command="Command1"/>
            <MenuButton Content="Button2" Command="Command2"/>
        </MenuControl.MenuButtons>
    </MenuControl>

我已经到了我可以让这个只用一个按钮正常工作的地步。添加第二个按钮后,我会从 XAML 中收到“指定参数超出有效值范围”。

这是与我的自定义控件上的菜单相关的代码隐藏:

    private static readonly DependencyProperty MenuProperty = DependencyProperty.Register("Menu", typeof(ObservableCollection<NavigationButton>), typeof(CCTNavigationHeader), new FrameworkPropertyMetadata(new ObservableCollection<NavigationButton>()));

    public ObservableCollection<NavigationButton> Menu
    {
        get
        {
            return (ObservableCollection<NavigationButton>)GetValue(MenuProperty);
        }
        set
        {
            SetValue(MenuProperty, value);
        }
    }

这里是 XAML:

    <ItemsControl ItemsSource="{Binding ElementName=ctlCCTNavigationHeader, Path=Menu}"/>

这是使用控件的代码,只有一个按钮:

    <Controls:CCTNavigationHeader Title="Test">
        <Controls:CCTNavigationHeader.Menu>
            <Controls:NavigationButton Content="Test"/>
        </Controls:CCTNavigationHeader.Menu>
    </Controls:CCTNavigationHeader>

这是使用阻塞控件的代码,一旦我添加了第二个按钮:

    <Controls:CCTNavigationHeader Title="Test">
        <Controls:CCTNavigationHeader.Menu>
            <Controls:NavigationButton Content="Test"/>
            <Controls:NavigationButton Content="Test"/>
        </Controls:CCTNavigationHeader.Menu>
    </Controls:CCTNavigationHeader>

我知道我在这里一定做错了什么,但我无法在任何地方找到任何完成此类解决方案的示例。任何熟悉在 WPF 中创建自定义用户控件的人都可以为我指明正确的方向吗?

【问题讨论】:

    标签: wpf xaml mvvm custom-controls


    【解决方案1】:

    想出了这个。创建控件时,我没有初始化 Menu 集合。以下代码修复了它:

        public CCTNavigationHeader()
        {
            InitializeComponent();
            Menu = new ObservableCollection<NavigationButton>(); //this line
        }
    

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多