【问题标题】:.NET Ribbon Dropdown - Can't focus on child form?.NET Ribbon Dropdown - 不能专注于子窗体?
【发布时间】:2015-09-17 23:26:06
【问题描述】:

我正在使用带有 winforms 的 .NET 4.5。我使用 ElementHost 是为了在我的应用程序中使用 XAML,其中唯一的 XAML 部分是功能区。我的应用程序有一个父 winform,托管多个子 winform。

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

这是来自功能区的示例下拉代码。如果我单击触发下拉菜单的主按钮,我将无法再触发任何子窗体上的 GotFocus 处理程序。

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

我可能发现了一个错误吗?

【问题讨论】:

  • 当打开两个或多个表单时,问题就消失了。当用户单击另一个表单时,它会在单击返回表单时重新激活原始表单的焦点。但是,如果只打开一个表单,该表单似乎会永久失去焦点。
  • 不理想,但一种解决方法是像这样添加 Focusable="False":。我仍然找不到合适的方法将焦点转移回目标子窗体,至少没有任何不寻常的黑客攻击。

标签: .net winforms xaml ribbon elementhost


【解决方案1】:

我觉得还可以。也许你可以修改这个例子来重现你的问题:

        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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多