gpt4 book ai didi

c# - 如何动态创建功能区选项卡?

转载 作者:太空狗 更新时间:2023-10-29 21:30:39 28 4
gpt4 key购买 nike

我想开始使用 PrismV4、MEF、Ribbon 开发新应用程序。但是现在,我有一个问题。如何为功能区动态创建选项卡?应用程序中的每个模块都可以在功能区中创建自己的选项卡。每个选项卡可能有很多组。

如何实现?我需要在哪里放置每个组的定义(要使用什么控件(按钮、文本框、组合框等)和命令绑定(bind)以及如何放置?

我需要在 Module 的某处编写 XAML,还是所有这些都可以通过代码来完成?最后一个问题,如何通知 Ribbon(在 Shell 中)将这些选项卡添加到 Ribbon?我应该使用 EventAggregator 从 Module 到 Shell 进行通信吗?或者?

最佳答案

对于非上下文选项卡,我最喜欢的解决此问题的方法是动态加载组件(例如通过反射),这些组件包括绑定(bind)到命令的 XAML 和包含命令实现并执行该命令绑定(bind)的 VM(或 Controller )。

对于上下文选项卡,我最喜欢的方法是包含模型到 ViewModel 映射的字典,然后按名称激活/停用使用上述方法加载的上下文选项卡(并将正确的数据上下文传递给它们 - View 模型).

伪代码应该或多或少像这样(取决于你的框架实现了什么以及你必须自己实现什么):

// Deserialize UI controllers from configuration files
// Each controller should act as view-model for its UI elements

// Register controllers with UI Manager
foreach controller in config.UiControllers uiManager.AddController(controller);


void UiManager.AddController(UiController controller)
{
// Load controller's tool windows
foreach toolWindow in contoller.toolWindows
{
toolWindow.LoadResources();
toolWindow.DataContext = controller;
mainWindow.AddToolWindow(toolWindow, contoller.PreferedUiRegion);
}

// Load controller's toolbars
foreach toolBar in controller.ToolBars
{
toolBar.DataContext = controller;
mainWindow.AddToolBar(toolBar);
}

// Load controller's contextual toolbar groups
foreach group in controller.ContextualToolBarGroups
{
group.DataContext = controller;
mainWindow.AddContextualToolBarGroupr(group);
}

// Load view models for specific model types
foreach item in controller.ViewModelsDictionary
{
this.RegisterViewModelType(item.ModelType, item.ViewModelType, item.ViewType);
}
}


void UiManager.OnItemSelected(Object selectedItem)
{
var viewModelType = GetViewModelTypeFromDictionary(selectedItem);
var viewType = GetViewTypeFromDictionary(selectedItem) ?? typeof(ContentPresentor);

var viewModel = Reflect.CreateObject(viewModelType);
var view = Reflection.CreateObject(viewType);

viewModel.Model = selectItem;
view.DataContext = viewModel;

// Enable activation of contextual tab group on activate of view (if user clicks on it)
view.OnActivatedCommandParameter = viewModel.ContextualTabGroupName;

// This command should ask mainWindow to find contextual tab group, by name, and activate it
view.OnActivatedCommand = ModelActivatedCommand;

mainWindow.DocumentArea.Content = view;
}

关于c# - 如何动态创建功能区选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4553833/

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