2008-11-18 188 views

回答

4

随着this question感谢p-daddy,我发现这个解决方案,它允许我使用ShowDialog的:

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 
    this.Capture = true; 
} 

protected override void OnCaptureChanged(EventArgs e) 
{ 
    if (!this.Capture) 
    { 
     if (!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position)) 
     { 
      this.Close(); 
     } 
     else 
     { 
      this.Capture = true; 
     } 
    } 

    base.OnCaptureChanged(e); 
} 
0

如果是在MDI应用程序子窗体,你可以捕获点击父窗体,否则该解决方案将是混乱。

我不相信你有什么建议表示无论如何直观的UI行为。你确定这是最好的设计吗?

+0

这是一个音量滑块 - 这似乎是w其他人都已经实施了他们。 – Simon 2008-11-18 11:34:20

+0

这与下拉框没有太大区别 - 只要您点击其他地方,选择列表就会消失。 – MusiGenesis 2008-11-18 11:38:12

7

在表单的停用事件中,放入“this.Close()”。只要您点击Windows中的其他任何位置,您的表单就会关闭。

更新:我认为你现在有一个音量按钮,并在Click事件中创建了一个VolumeSlider表单的实例,并通过调用ShowDialog()使其显示,直到用户关闭弹出窗口形成。在下一行中,您阅读用户选择的音量并将其用于您的程序中。

这是OK,但你已经注意到它迫使用户明确地关闭弹出窗口,以回到主程序。 Show()是你真正想在弹出窗体中使用的方法,但Show()不会阻止这意味着主窗体上的Click事件结束,而不知道新卷应该是什么。

一个简单的解决方案是你的主要形式是这样上创建一个公共方法:

public void SetVolume(int volume) 
{ 
    // do something with the volume - whatever you did before with it 
} 

然后,在你的音量按钮的Click事件(也主要形式),你让VolumeSlider看起来像这样:

VolumeSlider slider = new VolumeSlider(); 
slider.Show(this); // the "this" is needed for the next step 

在VolumeSlider形式,为用户的工作(我猜)滚动条,你把滚动条的ValueChanged事件代码(我认为这是它是什么):

MainForm owner = (MainForm)this.Owner; 
owner.SetVolume(scrollbar.Value); 

然后在VolumeSlider窗体的停用事件你会把this.Close()如上所述。您的表格将按照预期行事。

+0

不幸的是,这不适用于ShowDialog() – Simon 2008-11-18 15:29:42

+0

我:“医生,当我这样做的时候会感到痛苦。”医生:“不要那样做。”一秒钟见上面的更新。 – MusiGenesis 2008-11-18 16:06:51

+0

让我知道它是否适合你。我讨厌在同一时间出现sn and和错误。 :) – MusiGenesis 2008-11-18 17:53:18

0

如果您试图制作一个弹出式窗口,其行为有点像菜单,但它可以让您与控件进行交互,您可以尝试在tooltrip下拉菜单中托管一个usercontrol。

4

与西蒙的解决方案,我不得不由诺姆describt同样的问题。以下代码避免了“点击”问题......

protected override void WndProc(ref Message m) 
{  
    base.WndProc(ref m); 

    // if click outside dialog -> Close Dlg 
    if (m.Msg == NativeConstants.WM_NCACTIVATE) //0x86 
    { 
     if (this.Visible) 
     { 
      if (!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position)) 
       this.Close(); 
     } 
    } 
} 
0

SIMPLY WAY: 在Form1上使用此代码来调用窗口2:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles  Button1.Click 
    Form2.Owner = Me 
    Form2.Show() 
End Sub 

,然后再使用此代码在Form1:

Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick 
    If Form2.IsHandleCreated = True Then 
     Form2.Close() 
    End If 
End Sub 
-1

很简单:

private void button1_Click(object sender, EventArgs e) 
    { 
     Form f = new Form(); 
     f.LostFocus +=new EventHandler(f_LostFocus); 
     f.Show(); 
    } 

    void f_LostFocus(object sender, EventArgs e) 
    { 
     Form f = sender as Form; 
     f.Close(); 
     f.Dispose(); 
    } 
相关问题