我有一个与WPF Interop和Excel Addin的奇怪错误。我正在使用.Net 3.5 SP1。
我正在使用Add-in Express为Excel 2003创建自定义任务窗格。在该任务窗格中,我正在使用ElementHost来托管WPF UserControl。 UserControl只包含一个带有TextBox和ComboBox的Grid。我的问题是,虽然一切正常显示,但ComboBox不会保持下拉状态,除非我将鼠标按住向下箭头。
我认为这不一定与Add-in Express有关,因为当我尝试在Excel中无模式显示WPF窗口时,我遇到了类似的问题。
第二个问题是ComboBox似乎不愿意放弃焦点。如果我单击它,文本区域将变为灰色以指示它具有焦点,但我无法将焦点移动到窗口中的任何其他位置。夺取焦点的唯一方法是移动鼠标滚轮。
其他人有类似的问题,并设法修复它?
答案 0 :(得分:4)
Add-in Express为我查看了这个内容,结果发现它与添加到Excel的任务窗格的Window样式有关。如果您在Windows CreateParams中关闭WS_CHILD标志,则组合框和其他弹出窗口按预期工作。
他们给了我这段代码以添加到我的ADXExcelTaskPane:
private const uint WS_CHILD = 0x40000000;
private const uint WS_CLIPCHILDREN = 0x02000000;
private const uint WS_CLIPSIBLINGS = 0x04000000;
private CreateParams _CreateParams = new CreateParams();
protected override CreateParams CreateParams
{
get
{
_CreateParams = base.CreateParams;
if (!DesignMode)
_CreateParams.Style = (int)(WS_CLIPCHILDREN | WS_CLIPSIBLINGS); //| WS_CHILD
return _CreateParams;
}
}
答案 1 :(得分:0)
我遇到了同样的问题。我有一个WinForm用户控件托管的WPF用户控件,整个是Excel AddIn。我使用Visual Studio 2010和Excel 2007以及Excel 2010。
我的问题是,当我在Excel工作表中单击一次时,AddIn永远不会再次获得焦点。 我找到了一个解决方法。
在MouseEnter事件处理程序中,我将焦点放在自己身上(this.Focus())
public WpfContainerUserControl()
{
InitializeComponent();
GpecsBrowserTabUserControl gpecBrowser = elementHost1.Child as GpecsBrowserTabUserControl;
gpecBrowser.MouseEnter += new System.Windows.Input.MouseEventHandler(gpecBrowser_MouseEnter);
}
void gpecBrowser_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
this.Focus();
}