我找到了一个使用Windows 的SetParent()函数在WPF中设置Excel实例的解决方案.
问题是,鼠标和键盘不会对工作表做出反应,而是对工作簿做出反应.
完整示例项目在此处下载
我也试过WindowsFormsHost,但它具有相同的效果.
XAML
<Window x:Class="ExcelEditor.SimpleWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ExcelEditor"
mc:Ignorable="d" Loaded="Window_Loaded" Closing="Window_Closing"
Title="SimpleWindow" Height="450" Width="800">
<Grid x:Name="LayoutRoot">
</Grid>
Run Code Online (Sandbox Code Playgroud)
C#代码
using System;
using System.Windows;
namespace ExcelEditor
{
/// <summary>
/// Interaktionslogik für SimpleWindow.xaml
/// </summary>
public partial class SimpleWindow : Window
{
private Microsoft.Office.Interop.Excel.Application ExcelApplication;
public SimpleWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(this); // <- testing only (no success)
ExcelApplication = new Microsoft.Office.Interop.Excel.Application();
ExcelApplication.DisplayAlerts = false;
System.Windows.Interop.HwndSource …Run Code Online (Sandbox Code Playgroud) 我正在使用VSTO构建办公室插件.在具有不同DPI设置的多个监视器的系统上,我的自定义任务窗格的内容在具有较高DPI设置的监视器上绘制两次:
只有较小的版本实际上响应用户输入.较大的版本似乎只是一个放大的图像.
我尝试过使用各种DPI相关设置,例如:
AutoScaleMode在我的用户控制上.我尝试了所有选项,没有变化.SetProcessDpiAwareness.我尝试了所有选项,没有变化.dpiAware为true和false.没变.新的Web Addins没有这个问题.此外,内部任务窗格没有此问题.
这是一个已知的问题吗?我怎样才能解决这个问题?
我正在开发一个实时语言分析工具,需要使用VSTO加载项(使用C#编写的.NET4.6.1编写,突出显示单词以引起Word 2016中作者的注意).想一想语法/拼写检查,它会在单词下面添加一条波浪线,以显示该单词具有语法错误或拼写错误.我为我自己定义的一些规则添加了一个类似的功能.
我搜索周围添加波浪线,并无意中发现了Font.Underline和Font.UnderlineColor.我把它设置在一个单词的范围内,它似乎提供了我追随的视觉效果.但是有一个问题.我添加或加下划线颜色的每个下划线都会向撤消堆栈添加撤消操作.
我不希望这种情况发生,或者我想要一种方法来弹出我刚才在堆栈代码中执行的操作.目的是让用户能够使用CTRL + Z删除他更改的文本,而不会影响我的语言分析结果.
我该怎么做呢?
在这里记录了微软的问题 - 可以下载Repro:https://connect.microsoft.com/VisualStudio/feedback/details/741454/value-change-event-doesnt-fire-for-datetimepicker-controls-used-在-VSTO-插件
如果将DateTimePicker放在Excel VSTO浮动加载项中并在日历下拉时将其定位,则它位于加载项的边缘之外,请参见此处:

选择绿色中圈出的任何日期按预期工作,但点击任何以红色圈出的日期时,它只会关闭日历下拉菜单并且不会设置日期!
有谁知道我怎么解决这个问题?
编辑
这个SO用户使用WPF遇到了这个问题: VSTO WPF ContextMenu.MenuItem在没有引发的TaskPane外部单击

该问题的答案显示该问题已被报道连接一段时间但仍然没有VSTO 4.0 SP1的解决方案:https://connect.microsoft.com/VisualStudio/feedback/details/432998/excel-2007-vsto-custom-任务窗格与- WPF的上下文菜单具有焦点,问题
其中一个解决方法是使用DispatcherFrame来为消息添加消息并为菜单订阅GotFocusEvent和LostFocusEvent.http://blogs.msdn.com/b/vsod/archive/2009/12/16/excel-2007-wpf-events-are-not-fired-for-items-that-overlap-excel-ui-for- wpf-context-menus.aspx但这是菜单的所有WPF代码,而不是Winform DateTimePicker的解决方案.
Repro for Microsoft Connect:
使用TaskPane的新项目> Excel 2010加载项; 使用Microsoft.Office.Core;
namespace ExcelAddIn2 {public partial class ThisAddIn {TaskPaneView MyTaskView = null; Microsoft.Office.Tools.CustomTaskPane MyTaskPane = null;
using TaskPane;
using Microsoft.Office.Core;
namespace ExcelAddIn2
{
public partial class ThisAddIn
{
TaskPaneView MyTaskView = null;
Microsoft.Office.Tools.CustomTaskPane MyTaskPane = null;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
//setup custom taskpane …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Windows 10平板电脑(Dell Venue 8 Pro)上运行Windows窗体应用程序.通常,Windows将触摸事件转换为明显的鼠标事件对应物.然而,它正在做垂直滑动的奇怪事情.
我的应用程序有一个自定义控件(直接从其构造函数中Control调用派生SetStyle(ControlStyles.Selectable..., true)),显示Direct3D呈现的图形.控件将MouseDown- > MouseMove- > MouseUp序列解释为旋转关于外观位置的视图的请求.这在桌面上运行良好,但在平板电脑上它会中断:我的自定义控件上的垂直滑动以某种方式被Windows捕获并传递到附近DataGridView,在那里它们被解释为滚动表格的请求.在DataGridView我的控制是不一样的容器下的兄弟姐妹; 它们处于完全不同的控制层次级别.这是一个截图:
我做了一些调试,以证明在垂直滑动过程中没有任何鼠标事件可以控制我.当我抬起手指时,右边有一些涓涓细流,但在垂直滑动过程中没有任何东西.
问题似乎是我的代码(在事件处理程序中)根本没有运行,因为没有输入正在进入我的控制.
这里发生了什么,有什么办法可以告诉Windows不要将我控件上发生的垂直滑动事件发送到一个完全不相关的控件?
编辑:我应该补充一点,我Focus()在我的代码中调用了所有地方,以确保我的控件在鼠标悬停时聚焦.我把它放在OnMouseMove,OnMouseDown并且几乎每个其他鼠标事件.
编辑:我已经构建了一个小型Visual Studio 2010解决方案来演示此问题.这里有太多的代码可以在线重现,但很容易理解.构建它,将其安装在Windows 10平板电脑上,然后尝试在最右边的控件中垂直滑动.请注意,而不是那个控件接收一堆鼠标事件,DataGridView火灾Scroll.
更新:我已经明确测试了在DataGridView获取Scroll事件时我的控件是否集中.如果我如上所述呼叫Focus()我的控制以响应MouseMove等等,我的控制确实得到焦点并在垂直滑动时保持它DataGridView.Scroll.在DataGridView.Scroll事件处理程序中,我打印出我的控件是否是焦点,它是.所以这不是DataGridView偷窃重点的问题; DataGridView即使我的控制力集中,这也是我操控滑动的问题.
注意:如果我设置dataGridView.ScrollBars为ScrollBars.None,则滑动的鼠标事件会转到我的控件.我一直在弄乱丑陋的黑客,每当我的控制集中注意力时隐藏滚动条,并在每次聚焦时显示它们DataGridView.但他们都是丑陋的黑客,有令人不快的副作用.