簡體   English   中英

如果將WPF ComboBox放置在Word AddIn的底部,則不會觸發SelectionChanged事件

[英]WPF ComboBox not firing SelectionChanged event if placed at the bottom of Word AddIn

我正在開發Office Word加載項,並使用WPF控件將WinForms UserControl中的用戶界面用作容器(在ElementHost控件內部)。

我注意到ComboBox的問題是,如果放置在Word應用程序底部附近的項的AddIn底部,則不會觸發SelectionChanged事件。 例如,我可以單擊並選擇列出的第一個項目(如果幸運的話),否則ComboBox下拉列表(彈出窗口)將被關閉,並且不會觸發SelectionChanged事件。 而是,Word執行某些操作,例如縮放或更改頁面布局-如果Addin位於右側,則這些操作位於Word應用程序的右下角。

我發現的唯一解決方法是我使用ComboBox彈出框“ upside”。 在這種情況下,事件就很好了。 正如我所說,這是一種解決方法,我希望看到一些更智能的解決方案。

PS:如果我使用的是WinForms ComboBox控件,則將其放到底部不會導致此問題-SelectedIndexChanged事件按預期工作。

謝謝

編輯 :我添加了一些非常基本的示例代碼。

示例代碼:WpfControl.xaml-UI

<UserControl x:Class="WordAddIn.WpfControl" 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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="100*"></RowDefinition>
            <RowDefinition Height="40"></RowDefinition>
        </Grid.RowDefinitions>

        <ComboBox x:Name="cboItems" Grid.Row="1" Margin="10,10,10,10"
                  DisplayMemberPath="NAME"
                  SelectionChanged="cboItems_SelectionChanged"/>
    </Grid>
</UserControl>

示例代碼:WpfControl.xaml.cs-后面的代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WordAddIn
{
    /// <summary>
    /// Interaction logic for WpfControl.xaml
    /// </summary>
    public partial class WpfControl : UserControl
    {
        public class Item
        {
            public int ID { get; set; }
            public string NAME { get; set; }
        }

        public WpfControl()
        {
            InitializeComponent();

            List<Item> itemList = new List<Item>();

            for (int i = 1; i < 11; i++)
            {
                itemList.Add(new Item { ID = i, NAME = "Item " + i });
            }

            cboItems.ItemsSource = itemList;
        }

        private void cboItems_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems != null && e.AddedItems.Count > 0)
            {
                var item = ((object[])(e.AddedItems)).ToList().FirstOrDefault() as Item;

                MessageBox.Show("Item: " + item.NAME + " clicked");

                e.Handled = true;
            }

            e.Handled = false;
        }
    }
}

包含元素宿主和作為元素宿主子元素的WpfControl的WpfContrainer被添加為在Word功能區上單擊按鈕時的插件。

示例代碼:RibbonWord.cs

private void btnTest_Click(object sender, RibbonControlEventArgs e)
{
    WpfContainer wpfContainer = new WpfContainer();

    var wpfContainerPane = Globals.ThisAddIn.CustomTaskPanes.Add(wpfContainer, "AddIn");

    wpfContainerPane.Visible = true;
}

我遇到過同樣的問題。 當下拉菜單位於wpf外部時,SelectionChanged不起作用。 嘗試以這種方式更改代碼

Xaml:

   <ComboBox x:Name="cboItems" 
             Grid.Row="1" 
             Margin="10,10,10,10"
             DisplayMemberPath="NAME"
             SelectionChanged="cboItems_SelectionChanged"
             DropDownOpened="ComboBox_OnDropDownOpened"
             DropDownClosed="ComboBox_OnDropDownClosed" />

后面的代碼:

namespace WordAddIn
{        
    public partial class WpfControl : UserControl
    {
        // your code

        private DispatcherFrame dispatcherFrame;           

        private object DispatcherOperationBegin(object arg)
        {
            dispatcherFrame = new DispatcherFrame();
            Dispatcher.PushFrame(dispatcherFrame);
            return null;
        }

        private void ComboBox_OnDropDownOpened(object sender, EventArgs e)
        {
            Dispatcher.BeginInvoke(DispatcherPriority.Normal, new DispatcherOperationCallback(DispatcherOperationBegin), null);
        }

        private void ComboBox_OnDropDownClosed(object sender, EventArgs e)
        {
            dispatcherFrame.Continue = false;
        }
    }
}

您可以在這里找到有關DispatcherFrame的更多信息。

暫無
暫無

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

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