[英]ComboBox SelectionChanged event firing when we changing value of combobox WPF
[英]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.