我一直在寻找为我的应用程序提供插件支持的不同方法.理想情况下,我将创建一个核心功能,并基于不同的客户开发不同的插件/插件,如导入,导出数据等......有哪些方法可以通过插件架构使C#应用程序可扩展?
让我们举一个例子.如果我们有一个程序包含一个主菜单(File,Edit,View等)以及一个TreeView,它显示按制造商分组的不同品牌的汽车(福特,GM,目前).右键单击汽车会显示一个上下文菜单,唯一的选项是"删除汽车".
你怎么能开发应用程序以便可以部署插件,这样你就可以让一个客户在TreeView中看到一个新品牌,让我们说本田,并且还可以扩展汽车上下文菜单,以便他们现在可以"画一辆车" "?
在Eclipse/RCP开发中,扩展点和插件可以轻松处理.C#如何处理它?我一直在研究开发自己的插件架构并阅读MEF.
我有一个简单的try/catch块
try
{
// Open the connection
_connection.Open(); // [1]
}
catch( OracleException ex ) // [2]
{
// Handle the exception
int x = ex.ErrorCode;
}
Run Code Online (Sandbox Code Playgroud)
永远不会执行catch并且运行时报告'[1]处的'OracleException未处理',这让我头疼.显然,我有一个关联异常类型的catch语句.我甚至在[2]尝试了完全限定类型的Oracle.DataAccess.Client.OracleException,但仍然没有处理异常.
我实际上能够捕获catch的唯一方法是在[2]处捕获System.Exception.是什么造成了这种奇怪的行为?
我正在开发一个TreeView基于控件,我的双击事件继续冒泡我的TreeViewItem节点.
目标是TreeViewItem双击时展开或折叠.
我有一个样式,将事件的事件处理程序应用于MouseDoubleClick每个TreeViewItem.
这是处理事件的代码
private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e )
{
// Get the specific tree view item that was double clicked
TreeViewItem treeViewItem = sender as TreeViewItem;
// not null?
if( null != treeViewItem )
{
// Switch expanded state
if( true == treeViewItem.IsExpanded )
{
treeViewItem.IsExpanded = false;
}
else
{
treeViewItem.IsExpanded = true;
}
// Set event handled
e.Handled = true; // [1]
}
} …Run Code Online (Sandbox Code Playgroud) 我目前已经完成了一个项目的两个阶段之一,需要我使用C++将数据库信息写入XML.虽然使用第三方工具来实际格式化XML标签和数据,但我仍然需要设计一个模型以及业务逻辑来获取数据库表并将它们映射到XML结构中.
为此,我最终为每个XML结构创建了一个单独的类,从而产生了大量的类(~75).每个类都知道如何读取其关联表并通过第三方工具将自身序列化为XML.最后,系统运行良好(按时和预算),输出错误非常容易找到.
第二阶段几乎相同,但不是格式化文本,它将是二进制数据.因此,虽然我仍在考虑使用第一阶段使用的相同策略,但我想询问一下,这是一个更好的方法或设计模式,可以解决这个问题吗?特别是,由于第一阶段中某些XML类的大量依赖性,单元测试非常困难.
我在Qt4.7工作,我的对话框中有一个QListWidget.我有一个QString,需要匹配此小部件行中的当前文本(各行可编辑).查看与QListWidget相关联的信号,似乎存在选择不同索引时的信号,但是当前所选行的文本发生更改时没有信号.我认为currentTextChanged(QString)会这样做,但事实并非如此.我还想过尝试将每一行连接到某个东西,但QListWidgetItem没有任何内置信号.有谁知道这样做的方法?谢谢!
我用QStringListModel创建了一个QListView.
listModel = new QStringListModel(ui->listView);
ui->listView->setModel(listModel);
ui->listView->setEditTriggers(QListView::NoEditTriggers);
ui->listView->setDragDropMode(QListView::InternalMove);
Run Code Online (Sandbox Code Playgroud)
我使用以下方法添加项目:
void MainWindow::addItem(QString result)
{
if (result == "")
return;
listModel->insertRow(listModel->rowCount());
QModelIndex a = listModel->index(listModel->rowCount()-1);
listModel->setData(a,result);
}
Run Code Online (Sandbox Code Playgroud)
问题是,当您拖动列表中的项目并尝试将其移动到另一个位置时,它更喜欢覆盖您拖动它的项目.我不希望通过拖放操作删除项目.