我们的应用程序是一个包含许多模块和视图的大型项目 主窗口中有一个功能区,我们正在寻找将功能区集成到应用程序中的最佳方法.
我创建了一个服务模块,视图可以注册以添加与它们相关的功能区项目,此外,任何主视图实例都可以提供与该实例相关的自己的功能区项目.一个RibbonItem是一个小类,它抽象一个功能区项的选项,主要有Title,Description,Command,UIType和ChildItems.当主视图发生变化时,该服务负责重建功能区.
我的一位同事认为这是糟糕的MVVM,因为用户需要用C#代码而不是XAML来设计他们的功能区视图,他还说这样做很难让一组项目一次被禁用或启用,如这些项目的每个命令都需要单独更新其CanExecute.相反,他建议使用主要的Ribbon View和ViewModel文件,其中每个想要为其模块或视图添加功能区按钮的开发人员需要在View XAML中添加它们,并在ViewModel中添加相关命令.此外,VisualStates将用于根据ViewModel中的更改(例如视图更改或选择更改)确定要显示或启用的项目.我真的不喜欢这个解决方案,主要是因为所有开发人员都必须将他们的模块知识放在一次大文件中.
请注意,功能区中的某些项目(例如,选项,退出)对整个应用程序是通用的,而某些项目与特定应用程序域相关,而某些项目仅与特定视图相关.
编辑:我想我的主要问题是允许多个开发团队集成在一个功能区上的推荐方法是什么?我们是否应该有一个RibbonView和一个RibbonViewModel,它将包含功能区中的所有可能项目,每个团队都会将其项目添加到这些V/VM,并定义何时显示它们的逻辑(可能通过使用可视状态) ?或者我们是否允许每个视图,视图模型或模块在服务中注册功能区项目(在他们自己的C#代码中),然后让服务在活动视图随注册到该类型的所有项目更改时根据需要呈现功能区?或者有没有更好的方法来实现这种集成?
你怎么看?您是否对如何管理多个开发人员常见的单一功能区资源有更好的想法或意见?
谢谢,splintor
好的,所以我得到了自动生成的主要AddIn(附件1),还有我的功能区(附件2),我想从该功能区访问当前活动的Excel工作表.但System.Windows.Forms.Application不包含定义ActiveSheet.
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;
using System.Windows.Forms;
namespace ExcelAddIn1
{
public partial class ThisAddIn
{
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the …Run Code Online (Sandbox Code Playgroud) 我正在将该System.Windows.Controls.Ribbon库用于我的应用程序.一切都工作得非常好,除非我最大化窗口它开始离开屏幕.
我也注意到使用其他WPF应用程序但是当你使用RibbonWindow它时会变得更糟.

这是我的源代码(我认为没什么好激动的):
<RibbonWindow
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication1.MainWindow"
Title="TestWindow" Height="350" Width="525" Background="LightSteelBlue">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Ribbon Grid.Row="0">
<RibbonTab x:Name="TestRibbon" Header="TestRibbon">
<RibbonGroup>
<RibbonButton x:Name="TestButton" Label="Button" LargeImageSource="traffic_lights_green.png" />
</RibbonGroup>
</RibbonTab>
</Ribbon>
<ContentControl Grid.Row="1">
</ContentControl>
</Grid>
</RibbonWindow>
Run Code Online (Sandbox Code Playgroud)
有没有办法阻止窗口这样做?
我们在一个相当大而复杂的桌面应用程序中遇到了一些问题,其中使用Microsoft Ribbon for WPF(或与此相关的组合)会导致计算机挂起.
下面的简化代码似乎触发了许多计算机上的Windows挂起情况.有些计算机每次都会遇到这种情况,有些人永远不会体验到它.挂起将在某些计算机上使整个会话锁定(包括num lock和大写锁定),但在其他计算机上,鼠标仍会移动(num lock仍然停止运行).当计算机无响应时,远程登录和网络共享似乎仍然有效,但无法结束控制台会话.
简而言之,似乎是行为的根本原因是几件事的结合:
我们后来WS_EX_COMPOSITED只使用了几个选定的表单来解决这个问题,但我非常想了解这个问题的根本原因.
我还没有找到一种直接的方法来重现挂起,但这个最小的应用程序似乎通过做一些最大化/恢复并将鼠标悬停在功能区按钮上方来完成业务,至少在某些机器上完成.
以下代码编译为x86 .NET 4.0,针对Microsoft WPF功能区 .NET 4.0库.
using System;
using System.Windows.Forms;
using Microsoft.Windows.Controls.Ribbon;
using System.Windows.Interop;
using System.Windows.Forms.Integration;
namespace WindowsRibbonHang
{
public class Form1 : Form
{
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
public Form1()
{
Ribbon ribbon = new Ribbon();
RibbonTab tab = new RibbonTab { Header = …Run Code Online (Sandbox Code Playgroud) 嘿所有我试图在Outlook 2010 的默认主页选项卡中创建一个按钮.问题是,在VS2013中我添加了一个功能区(可视)并添加了按钮组,但它不断添加到TabAddIns选项卡.


我需要设置什么才能使自定义组/按钮显示在" 主页"选项卡中而不是创建自己的选项卡?
谢谢!
使用最新的(2010年10月)WPF功能区库,存在一个菜单项,用于最小化/最大化(或折叠/展开,如果您愿意)功能区控件.
有没有人知道是否还有一种方法可以挂钩控制此行为的事件,以便可以从单独的UI以编程方式控制它?或者,更好的是,有没有办法让折叠/展开按钮显示在功能区中,就像2010 Office应用程序一样?
Microsoft是否为非Office应用程序提供了功能区控件?如果没有,有没有免费的?
我喜欢该组件,并希望使用它我的WinForm 4.0应用程序.
我尝试将我的Outlook 2010加载项添加到TabAppointment选项卡.当我将它添加到TabCalendar时它完全有效,但如果你点击日历中的约会,将显示另一个选项卡,我猜这个选项卡是TabAppointment.当然,我的插件应该在那里.用户不必首先更改选项卡以使用它.
控件/选项卡的OfficeId列表.列表可以在这里下载.
应该放置加载项的选项卡
每次选择日历项时,我的加载项都应该可见.因此,正如我所写,TabCalendar工作,但它放在开始标签中.
当我选择TabAppointment时,有人知道为什么我的按钮组在那里不可见?这是错误的标签吗?或者是否无法在此处添加加载项?
我无法获得在Visual Studio中显示的WPF功能区项目.以下是Visual Studio 2010中存在问题的人的线程链接.
我已经尝试了那里建议的一切但无济于事.
我安装了Visual Studio 2012 Express for Desktop但没有显示任何内容.我试过卸载并重新安装,但没有运气.
我已成功实现了Microsoft示例"演练:使用功能区按钮同步自定义任务窗格",如下所示:http: //msdn.microsoft.com/en-us/library/bb608590.aspx
最初我遇到了一个问题,任务窗格没有显示,结果是我的加载项和微软的"分析工具包"之间发生了一些冲突.禁用Analysis Toolpack后,自定义任务窗格开始按预期显示和隐藏.
然后,当用户按下按钮时,我编写了一些代码来更改所选范围内的单元格.这似乎工作得很好 - 直到我打开另一本工作簿!每个工作簿窗口都有自己的加载项功能区,但是当我单击切换按钮打开/关闭自定义任务窗格时,它只会打开/关闭创建的第一个窗口的自定义任务窗格.这与我单击切换按钮的窗口无关.
该代码在ThisAddIn_Startup中实例化CustomTaskPane对象(就像在示例代码中一样).我唯一添加的是UserControl中的按钮操作:
using xl = Microsoft.Office.Interop.Excel;
namespace SynchronizeTaskPaneAndRibbon
{
public partial class TaskPaneControl : UserControl
{
public TaskPaneControl()
{
InitializeComponent();
}
private void actionButton1_Click(object sender, EventArgs e)
{
xl.Range selection_rng = Globals.ThisAddIn.Application.Selection;
foreach (xl.Range cell in selection_rng.Cells)
{
if (cell.Value is string)
{
string v = cell.Value;
cell.Value = v + "*";
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码的其余部分就像在示例中一样.
有没有办法更改示例,以便它可以用于打开多个工作簿?我想要的是相同的加载项出现在每个工作簿窗口中,具有相同的功能区和相同的自定义窗格.当然,要将任何功能区操作(例如按下按钮)路由到出现在同一窗口中的自定义任务窗格.
ribbon ×10
c# ×6
.net ×5
wpf ×5
vb.net ×2
winforms ×2
c#-4.0 ×1
excel-addins ×1
ms-office ×1
mvvm ×1
outlook ×1
outlook-2010 ×1
vsto ×1
wpf-controls ×1