簡體   English   中英

WPF、Excel 和 ContextMenu

[英]WPF, Excel and ContextMenu

我實現了一個簡單的 WPF-Window 以加載到 excel 的 VSTO-Addin 應用程序中。

上下文菜單閃爍,即它被顯示並突然消失; 僅當 window 不是模態時才會發生這種情況。

重現問題非常簡單; 首先,您必須創建一個 Excel 200X VSTO 插件。

添加一個 WPF 用戶控件,將根節點從 UserControl 更改為 Window。 始終更改后面的代碼,即將超類從 UserControl 替換為 Window。

This is a trick to create a WPF Window because when you use a VSTO Add-in there is no WPF Window among project items. 這也是問題最有可能的罪魁禍首。
window 僅包含一個帶有上下文菜單的 Label。

xaml:

<Window x:Class="ExcelAddIn9.MyWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:ExcelAddIn9"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<StackPanel>
    <Label>Some label
        <Label.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Context Menu"/>
            </ContextMenu>
        </Label.ContextMenu>
    
    </Label>
</StackPanel>
</Window>

當它工作時 output 是愚蠢的:

工作上下文菜單

只是為了展示,您可以從 ThisAddIn class 中的任何位置打開 window。

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        MyWindow w = new MyWindow();
        w.Show();

    }

這閃爍。 要讓它正常工作, w.Show()更改為w.ShowDialog() 同樣,這不是您在實際應用程序中放置對話框的地方,因為它會阻止 excel 加載,但為了顯示問題它沒關系。

正如我所說,我認為這可能是他們不為 VSTO 項目提供 WPF-Window 項目的原因之一,但同樣我想深入調查這個問題,以便讓 ContextMenu 也能工作在非對話應用程序中。
我想檢查這個問題是否是 VSTO 中 WPF windows 的基本故障的症狀並評估其他解決方案(可能將它們嵌入到 WinForms 窗口中)。

VSTO 版本 2010。

您必須指定父 Outlook window 句柄( Owner )。 使用WindowInteropHelper class 協助 Windows Presentation Foundation (WPF) 和 Win32 代碼之間的互操作。

一個示例場景是,如果您需要在 Win32 應用程序中托管 WPF 對話框。 使用對話框的 WPF window object 初始化 WindowInteropHelper。 然后,您可以從 Handle 屬性中獲取 WPF 窗口的句柄 (HWND),並使用 Owner 屬性指定 WPF window 的所有者。 以下代碼示例顯示了在 Win32 應用程序中托管 WPF 對話框時如何使用 WindowInteropHelper。

WindowInteropHelper wih = new WindowInteropHelper(myDialog);
wih.Owner = ownerHwnd;
myDialog.Show();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM