.NET功能区下拉列表-Can';你不关注儿童形态吗?

.NET功能区下拉列表-Can';你不关注儿童形态吗?,.net,winforms,xaml,ribbon,elementhost,.net,Winforms,Xaml,Ribbon,Elementhost,我将.NET4.5与winforms一起使用。我使用ElementHost是为了在我的应用程序中使用XAML,其中唯一的XAML部分是Ribbon。我的应用程序有一个父winform,托管多个子winforms 当我单击应用程序中的任何子窗体时,窗体将按预期聚焦(GotFocus事件处理程序)。但是,当我单击功能区上的任何下拉列表时,子窗体不再触发GotFocus处理程序,即使我仍然可以用鼠标拖动窗体。此外,当我单击功能区中未下拉的常规按钮时,子窗体将按预期激活GotFocus处理程序 下面是功

我将.NET4.5与winforms一起使用。我使用ElementHost是为了在我的应用程序中使用XAML,其中唯一的XAML部分是Ribbon。我的应用程序有一个父winform,托管多个子winforms

当我单击应用程序中的任何子窗体时,窗体将按预期聚焦(GotFocus事件处理程序)。但是,当我单击功能区上的任何下拉列表时,子窗体不再触发GotFocus处理程序,即使我仍然可以用鼠标拖动窗体。此外,当我单击功能区中未下拉的常规按钮时,子窗体将按预期激活GotFocus处理程序

下面是功能区中的示例下拉代码。如果单击触发下拉列表的主按钮,则无法再在任何子窗体上触发GotFocus处理程序

<RibbonMenuButton LargeImageSource="" >
    <RibbonMenuItem ImageSource = "" />
    <RibbonMenuItem ImageSource = "" />
    <RibbonMenuItem ImageSource = "" />
</RibbonMenuButton>


我有没有发现一只虫子

我觉得还可以。也许您可以修改此示例以重新创建您的问题:

        Form fff = new Form();
        ElementHost eh = new ElementHost() { Dock = DockStyle.Top };
        var dp = new System.Windows.Controls.DockPanel();
        eh.BackColor = Color.LightYellow;
        dp.Background = System.Windows.Media.Brushes.LightSkyBlue;
        eh.Child = dp;
        var combo = new System.Windows.Controls.ComboBox();
        combo.Items.Add("Value1");
        combo.Items.Add("Value2");
        combo.Items.Add("Value3");
        dp.Children.Add(combo); //new System.Windows.Controls.Button { Content = "Button Text" });
        fff.Controls.Add(eh);
        fff.IsMdiContainer = true;
        var fc1 = new Form { TopLevel = false, Visible = true, Size = new Size(300,300), Location = new Point(100,100) };
        var fc2 = new Form { TopLevel = false, Visible = true, Size = new Size(300,300), Location = new Point(100,100) };

        fc1.MdiParent = fff;
        fc2.MdiParent = fff;

        fc1.GotFocus += delegate {
            fc1.Text = "Got focus1";
        };
        fc2.GotFocus += delegate {
            fc2.Text = "got focus2";
        };
        fc1.LostFocus += delegate {
            fc1.Text = "Lost focus1";
        };
        fc2.LostFocus += delegate {
            fc2.Text = "Lost focus2";
        };


        Application.Run(fff);

当有两个或多个表单打开时,问题就消失了。当用户单击另一个表单时,当再次单击该表单时,会重新激活原始表单的焦点。但是,如果只有一个表单处于打开状态,则该表单似乎会永久失去焦点。这并不理想,但解决方法是添加Focusable=“False”,如下所示:。我仍然没有找到合适的方法将注意力转移回目标子表单上,至少在没有任何异常攻击的情况下。