代码之家  ›  专栏  ›  技术社区  ›  Ivan

WPF中的可自定义工具栏

  •  7
  • Ivan  · 技术社区  · 14 年前

    我希望在我的应用程序中有可自定义的工具栏,比如VisualStudio2008提供的工具栏(右键单击工具栏,自定义)。我需要一个WPF解决方案,但我还没有找到任何解决方案(无论是在SO上,还是在Google上)。我确实找到了这个 Visual Studio 2010 blog entry

    2 回复  |  直到 14 年前
        1
  •  3
  •   andyp    14 年前

    我只是玩了一会儿,我认为单独使用WPF实现所需的行为应该相对容易(不需要额外的库或框架)。我包括示例代码来添加 Button ToolBar

    为了得到你想要的行为,我有一个工具栏按钮的集合和另一个可用按钮的集合。工具栏 ItemsSource 将绑定到第一个集合。单击上下文菜单中的“customize”按钮后,我将显示另一个带有两个 ListViews (每个绑定到其中一个集合)和按钮,用于将完整集合中的按钮添加到工具栏集合或从工具栏集合中删除按钮。嗯。

    代码:

    public ObservableCollection<Button> Buttons { get; set; }
    
    public MainWindow()
    {
        InitializeComponent();
    
        Buttons = new ObservableCollection<Button>();
        AddButton();
    
        DataContext = this;
    }
    
    private void ButtonAddButton_Click(object sender, RoutedEventArgs e)
    {
        AddButton();
    }
    
    private void AddButton()
    {
        var button = new Button();
        button.Content = "Add Button (" + Buttons.Count + ")";
        button.Click += ButtonAddButton_Click;
        Buttons.Add(button);
    }
    

    <Grid>
        <ToolBarTray>
            <ToolBar ItemsSource="{Binding Buttons}">
                <ToolBar.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Customize" />
                    </ContextMenu>
                </ToolBar.ContextMenu>
            </ToolBar>
        </ToolBarTray>
    </Grid>
    
        2
  •  1
  •   Eli Arbel    14 年前

    由于工具栏是一个ItemsControl,您可以尝试使用拖放框架来实现所需的功能。

    http://bea.stollnitz.com/blog/?p=53

    这是处理数据绑定项的一个很好的解决方案。如果不使用数据绑定来显示工具栏项,则需要对代码进行一点自定义(尽管我建议您使用数据绑定,但这会使保存自定义项变得更简单)。

    当您在应用程序中点击“自定义”时,您可以打开一个包含可用项的列表框(必须在同一窗口中,上述解决方案才能工作),并使用附加属性启用从工具栏和列表框拖放。