2016-11-09 68 views
1

恐怕答案可能不是......但有些背景。要在尺寸邏輯超出可見邊框的窗口上繪製自定義邊框(就像它在Windows 10上那樣),我在邊緣周圍添加了分層窗口以捕獲消息,然後將它們轉發到中央窗口。這工作得很好,直到表單模態顯示,此時所有的邊緣窗口都自動禁用。顯然這是設計的......但我不確定是否有解決辦法。我嘗試製作中央窗口所擁有的邊緣窗口,但那不起作用。當顯示模態窗口時,有沒有辦法讓其他窗口保持活動狀態?

或者也許有一個更好的方法完全。

這裏是問題的一個樣本:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     } 

     protected override void OnClick(EventArgs e) 
     { 
     base.OnClick(e); 

     Form f2 = new Form(); 

     f2.Text = "Non Modal"; 

     f2.Show(); 

     Form f3 = new Form(); 

     f3.Text = "Modal"; 

     f3.ShowDialog(this); 
     } 
    } 
+1

模式對話框僅禁用它的所有者。目前還不清楚你已經實現了什麼設置,所以模態對話框也會禁用這些額外的窗口。 – IInspectable

+0

增加了一個示例來說明您所說的看起來不是這種情況。 – user109078

回答

0

我認爲你可以假模態窗口,因此它不是模式,但禁用調用者。我在一個自己的項目中使用了這個。我這樣做:

//Setup small Interface 
public interface IDialog 
{ 
    //Our own Event which tell the caller if the Dialog is active/inactive 
    public event DialogChangedEventArgs DialogChanged; 
} 

//Setup EventArgs for our own Event 
public class DialogChangedEventArgs : EventArgs 
{ 
    public bool DialogActive{get;} 

    public DialogChangedEventArgs(bool dialogActive) 
    { 
     DialogActive = dialogActive; 
    } 
} 

//Setup the Form which act as Dialog in any other form 
public class Form2 : Form, IDialog 
{ 
    public event EventHandler<DialogChangedEventArgs> DialogChanged; 

    //If this Form is shown we fire the Event and tell subscriber we are active 
    private void Form2_Shown(object sender, EventArgs e) 
    { 
     DialogChanged?.Invoke(this, true); 
    } 

    //If the user close the Form we telling subscriber we go inactive 
    private void Form2_Closing(object sender, CancelEventArgs e) 
    { 
     DialogChanged?.Invoke(this, false); 
    } 
} 

public class Form1 : Form 
{ 
    //Setup our Form2 and show it (not modal here!!!) 
    private void Initialize() 
    { 
    Form2 newForm = new Form2(); 
    newForm.DialogChanged += DialogChanged; 
    newForm.Show(); 
    } 

    private void Form2_DialogChanged(object sender, DialogChangedEventArgs e) 
    { 
     //Now check if Form2 is active or inactive and enable/disable Form1 
     //So just Form1 will be disabled. 
     Enable = !e.DialogActive; 
    } 
} 

這很簡單。只需使用一個事件來告訴你的第一個表格:Hey iam第二個表格並激活。然後,您可以在第二個活動時禁用第一個窗體。您可以完全控制哪些表單處於活動狀態。希望這可以幫助。

+0

使用EnableWindow可能會更好,因此mainform上的所有控件都不會更改爲禁用外觀,但我認爲這種技術可以很好地工作! – user109078

相關問題