gpt4 book ai didi

c# - Word 加载项拖放到文档中

转载 作者:太空狗 更新时间:2023-10-29 22:00:50 27 4
gpt4 key购买 nike

我正在创建一个 Word 加载项,为了允许将某些内容从自定义任务 Pane 拖到文档中,我遵循了以下指南: http://msdn.microsoft.com/en-us/library/office/hh780901(v=office.14).aspx

使用这种方法确实存在一些缺点。

首先,捕获放置事件的透明 Windows 窗体(在我的例子中是 WPF)是窗口的大小,而不是文档的大小,并且 RangeFromPoint 总是返回一个值,即使我们没有在文档上(对于例如,如果我们在功能区上方)。所以一旦你拖了一些东西,这个表格就创建好了,无论你拖到哪里,它都会被放置在文档中。一旦开始,就没有优雅的取消方式。

我的问题是:

有没有人在 Word 加载项中使用拖放操作,并找到了比 Microsoft 提供的示例更好的处理方法?

最好使用当前的解决方案,但要知道用户什么时候没有在文档上拖动或让透明窗口只显示在文档区域上。

最佳答案

希望您已经有了答案。

我有自己的解决方案。

那么,我的要求:

我有一个自定义 Pane ,其中包含一个列表框,每个项目都是一个普通字符串。当我将项目从列表框中拖到文档的特定位置时,我想在该位置插入一个合并字段。合并字段的名称是项目的文本。

一开始很简单,然后我遇到了一个问题,就像你在问题中描述的那样。

关于代码

所以,有一个列表框,你需要处理mouseDown和mouseMove,不用担心mouseUp。

在 mouseDown 处理程序中,我记录了边界,如果鼠标移出该边界,拖动将开始。

然后,在 listBox_MouseMoveHandler 中,我检查鼠标的位置以启动拖放。我必须为 DoDragDrop 方法使用 DragDropEffects.Copy

DoDragDrop((发件人为 ListControl).SelectedValue, DragDropEffects.Copy);

有了那个选项,SelectedValue就会被插入到drop的位置,插入之后,它也会被选中。

然后,我只是检查选择是否不为空,并用合并字段替换所选文本。当然,我在 DoDragDrop 之前折叠了选择。这就是全部技巧。

    private int _selectedItemIndex;

private Rectangle dragBoxFromMouseDown;

private void CustomizationForListBox(ListBox listBox)
{
listBox.ItemHeight = 25;
listBox.DrawMode = DrawMode.OwnerDrawFixed;
listBox.DrawItem += ListBox_DrawItem;
listBox.MouseDoubleClick += listBox_MouseDoubleClick;
listBox.MouseMove += listBox_MouseMoveHandler;
listBox.MouseUp += listBox_MouseUp;

listBox.MouseDown += (sender, e) =>
{
// Handle drag/drop
if (e.Button == MouseButtons.Left)
{
_selectedItemIndex = listBox.IndexFromPoint(e.Location);

// Remember the point where the mouse down occurred. The DragSize indicates
// the size that the mouse can move before a drag event should be started.
Size dragSize = SystemInformation.DragSize;

// Create a rectangle using the DragSize, with the mouse position being
// at the center of the rectangle.
dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
e.Y - (dragSize.Height / 2)), dragSize);
}
};

}

private void listBox_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// Reset the drag rectangle when the mouse button is raised.
dragBoxFromMouseDown = Rectangle.Empty;
}

}

private void listBox_MouseMoveHandler(object sender, MouseEventArgs e)
{
// Handle drag and drop
// To check if the Mouse left button is clicked
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
// If the mouse moves outside the rectangle, start the drag.
if (dragBoxFromMouseDown != Rectangle.Empty &&
!dragBoxFromMouseDown.Contains(e.X, e.Y))
{
// Collapse current selection, now we know nothing is selected
Globals.ThisAddIn.Application.Selection.Collapse(WdCollapseDirection.wdCollapseEnd);

//Start Drag Drop
DoDragDrop((sender as ListControl).SelectedValue, DragDropEffects.Copy);
if (_selectedItemIndex != -1)
{
// If the drag/drop was successful, there dropped text must be selected
if (!String.IsNullOrWhiteSpace(Globals.ThisAddIn.Application.Selection.Text))
{


//用合并字段替换所选文本 MergeFieldHelper.InsertSingleMergeField(mergeFieldInfos[_selectedItemIndex].Name);
}
}
}
}
}

关于c# - Word 加载项拖放到文档中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26591542/

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