我在C#中有一个表单应用程序.当我更改显示器的DPI时,所有控件都会移动.我使用了代码this.AutoScaleMode = AutoScaleMode.Dpi,但它没有避免这个问题.
有没有人有想法?
我正在使用Visual Studio Professional 2013编写Excel 2010插件.我创建了一个简单的CustomTaskPane,其中包含一个System.Windows.Forms.WebBrowser子文件.该插件工作正常,我可以通过单击并更改复选框的状态在Web浏览器内导航.

当我点击输入文本框时,我得到焦点,我看到光标闪烁,但是当我开始输入时,文本被发送到Excel并写入单元格而不是浏览器中的文本框.
我在功能区加载时添加自定义任务窗格.
private void Ribbon_Load(object sender, RibbonUIEventArgs e)
{
TaskPaneView taskPaneView = new TaskPaneView();
Microsoft.Office.Tools.CustomTaskPane myTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, "Title");
myTaskPane.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)
当我点击文本框然后点击F6它正常工作.customtaskpane标题稍微变暗,文本框中会捕获文本.
我如何解决这个问题,以便当我点击输入文本框时,文本进入框而不是Excel?
编辑:好的,我做了一些测试. 如果我在TaskPaneView上添加事件以跟踪鼠标输入并单击它们可以正常工作,但前提是我删除了Web浏览器子项.这意味着Web浏览器以某种方式阻止这些事件并阻止TaskPaneView理解它具有焦点.如果我还在浏览器旁边的TaskPaneView中添加了一个文本框表单控件,文本框工作正常,TaskPaneView理解它有焦点,然后浏览器中的输入文本字段开始工作.如果我直接在Web浏览器上调用焦点方法,则TaskPaneView会理解它具有焦点并且一切正常.很明显,问题不在于键盘问题,而是在点击浏览器时没有告诉它有问题的TaskPaneView问题,因此击键会转到错误的区域.如果我能找到一种方法让TaskPaneView理解它有焦点,那么每个标志都应该有效.
在这里记录了微软的问题 - 可以下载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)