C# 链接两个关于z索引的表格

C# 链接两个关于z索引的表格,c#,winforms,focus,z-index,C#,Winforms,Focus,Z Index,我有两种形式,它们的业务逻辑相互关联。我希望第二个在第一个之后,只要我关注第一个,反之亦然 为了让我的问题更清楚,我将描述我想要这个链接的原因。 第一种形式表示数据库对象的形式,第二种形式表示链接到此特定对象的PDF文档的查看器。正如您所理解的,我希望避免混淆,如果用户打开两对表单(两个数据库对象),并且第一个对象的第一个表单显示在第二个对象的PDF文档旁边,就会发生混淆 到目前为止,我已经创建了一个名为FormPair的类,它包含两个表单作为属性,并且我在每个表单的Focus事件上添加了一个事

我有两种形式,它们的业务逻辑相互关联。我希望第二个在第一个之后,只要我关注第一个,反之亦然

为了让我的问题更清楚,我将描述我想要这个链接的原因。 第一种形式表示数据库对象的形式,第二种形式表示链接到此特定对象的PDF文档的查看器。正如您所理解的,我希望避免混淆,如果用户打开两对表单(两个数据库对象),并且第一个对象的第一个表单显示在第二个对象的PDF文档旁边,就会发生混淆

到目前为止,我已经创建了一个名为
FormPair
的类,它包含两个表单作为属性,并且我在每个表单的
Focus
事件上添加了一个事件处理程序,它执行以下操作:

  • 关注另一种形式
  • 再次关注触发事件的表单
  • 它有点工作,但看起来不太好(闪烁,它失去了特定子控制的焦点,等等)。我是否可以用某种方式使用次窗体的z索引并获得更好的结果?

    BringToFront()
    是一个很好的解决方案,但当我两次调用它(在第二个窗体上,然后在第一个窗体上)时,它会闪烁一点。最后,我使用了
    user32.dll
    中的一个名为
    SetWindowPos
    的外部方法,创建了一个我自己的新的bringToFront方法,它一点也不闪烁,让我感觉这两种形式都是相互链接的。下面是它(X的所有内容都是自定义类/枚举/结构):

    在哪里

    然后在
    FormPair

    public partial class XFormPair
    {
        // properties
        public XForm leftForm { get; set; }
        public XForm rightForm { get; set; }
    
        // events
        private void rightFormActivated(object sender, EventArgs e)
        {
            leftForm.bringToFront();
            rightForm.bringToFront();
        }
        private void leftFormActivated(object sender, EventArgs e)
        {
            rightForm.bringToFront();
            leftForm.bringToFront();
        }
    
    }
    

    您是否尝试过
    TopMost=true?或者,至少,
    BringToFront()
    public struct XFormZIndex
    {
        public static IntPtr
        NoTopMost = new IntPtr(-2),
        TopMost = new IntPtr(-1),
        Top = new IntPtr(0),
        Bottom = new IntPtr(1);
    }
    [Flags]
    public enum XWindowPositionFlag : uint
    {
        SWP_ASYNCWINDOWPOS = 0x4000,
        SWP_DEFERERASE = 0x2000,
        SWP_DRAWFRAME = 0x0020,
        SWP_FRAMECHANGED = 0x0020,
        SWP_HIDEWINDOW = 0x0080,
        SWP_NOACTIVATE = 0x0010,
        SWP_NOCOPYBITS = 0x0100,
        SWP_NOMOVE = 0x0002,
        SWP_NOOWNERZORDER = 0x0200,
        SWP_NOREDRAW = 0x0008,
        SWP_NOREPOSITION = 0x0200,
        SWP_NOSENDCHANGING = 0x0400,
        SWP_NOSIZE = 0x0001,
        SWP_NOZORDER = 0x0004,
        SWP_SHOWWINDOW = 0x0040,
    }
    
    public partial class XFormPair
    {
        // properties
        public XForm leftForm { get; set; }
        public XForm rightForm { get; set; }
    
        // events
        private void rightFormActivated(object sender, EventArgs e)
        {
            leftForm.bringToFront();
            rightForm.bringToFront();
        }
        private void leftFormActivated(object sender, EventArgs e)
        {
            rightForm.bringToFront();
            leftForm.bringToFront();
        }
    
    }