为了找出原因,我开始删除大量代码并重新测试,以确定它是否有任何不同。
我最终创建了这个MCVE:
请注意,这是一个文档级模板项目。
using System;
using Microsoft.Office.Tools.Word;
using Microsoft.Office.Interop.Word;
namespace TableUndoBug
{
public partial class ThisDocument
{
private void ThisDocument_Startup(object sender, System.EventArgs e)
{
BeforeSave += ThisDocument_BeforeSave;
}
private void ThisDocument_BeforeSave(object sender, SaveEventArgs e)
{
try
{
foreach (Table table in Tables)
{
int numRows = table.Rows.Count;
var c = table.Cell(numRows, 0); // this line is the culprit
// this call should be using 1, not 0, but it completes successfully anyway.
// if you change it, this bug disappears
}
}
catch (Exception)
{
}
}
private void ThisDocument_Shutdown(object sender, System.EventArgs e)
{
}
#region VSTO Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisDocument_Startup);
this.Shutdown += new System.EventHandler(ThisDocument_Shutdown);
}
#endregion
}
}
下面是测试的步骤(我还发现了更多的测试用例):
这个示例项目演示了Word 2013/VSTO中的一个错误。
要复制:
-
从Visual Studio运行它。
-
将文档保存到任何位置。
-
插入表。
测试用例1:
-
再保存2次。
-
尝试使用悬停时弹出的控件插入列。
图形将被弄乱,但它不会挂起。
测试用例2:
-
使用表的上下文菜单添加标题(我认为这里重要的是样式应用程序)。
-
-
尝试使用悬停时弹出的控件插入列。
图形会被弄乱,它会挂一段时间。
测试用例3:
-
再保存2次。
-
-
使用快速访问工具栏中的“重做”按钮。
图形会被弄乱,它会挂一段时间。