2009-05-20 14 views
14

私は.NET 3.5 MDI WinFormsアプリケーションを持っています。.NETで新しい最大化されたMDI子フォームを作成する際のアイコンの問題

子フォームのIconプロパティを設定し、アイコンがフォームの左上隅に正しく表示されます。私は子供のフォームを最大化し、アイコンはまだOKです。

子フォームが最大化されていても、が最大化され、別の子ウィンドウが自動的に最大化されます。このフォームのアイコンは、Iconプロパティのアイコンではなく、デフォルトの.NETアイコン(青、赤、黄色の四角形のアイコン)です。ただし、 MDI親フォームのサイズを変更すると、アイコンが自動的にリセットされ、正しく表示されます。

誰でも回避策があるのですか、これがどうして起こるのか知っていますか?これはあなたのことを意味してい

private void StatsForm_Load(object sender, EventArgs e) 
{ 
    //bug that means you have to set the desired icon again otherwise it reverts to default when child form is maximised 
    Icon = new System.Drawing.Icon("research.ico"); 
} 

+0

は、あなたがそれを開いた後、子ウィンドウ上.Refreshをやってみましたがありますか? –

答えて

8

右の私が見つけた解決策は...このため

この問題を回避するには、次のように子フォームのLoadイベントにもう一度アイコンを設定することです問題のアイコンファイルをVSプロジェクト/ソリューションに最初に追加し、ソリューションの構築時にコピーされるように「常にコピーする」に設定する必要があります。

HTH Calanus

+2

魅力のように動作します。ありがとう。何らかの理由で私はアイコンをリセットしようとは思わなかった。また、埋め込みリソースとしても機能するので、最終ディレクトリに大量の(置き換え可能な)ファイルが置かれているわけではありません。 –

4

私が唯一の解決策は無効化して、MDI子アクティブにすることがわかった:

document.Show(); 
// Work-around for error in WinForms that causes MDI children to be loaded with the default .NET icon when opened maximised. 
ActivateMdiChild(null); 
ActivateMdiChild(document); 

これはthis reply on MSDN forumsに与えられた解決策があるが、それは私のために働きました。

+0

動作しますが、ShowDialogをどこにでも使用すると問題が発生します。 – Drake

+0

どのような問題がありますか? –

+0

コードでShowの代わりにShowDialogを使用すると、その呼び出しでブロックが実行されます。ダイアログが閉じられると、ActivateMdiChildの呼び出しは実行されますが、 'document'がその時点で存在しないため、2番目の呼び出しは機能しません – alldayremix

0

私の解決策: MdiChildの "ShowIcon"プロパティをtrueに設定したまま、1x1透明アイコンを割り当てます。問題が解決しました。

+1

おそらく私は何かが不足しているかもしれませんが、元の質問。問題はアイコンを表示したくないときにアイコンが表示されるのではなく、表示したい*アイコンが表示されず、代わりにデフォルトに置き換えられることです。 –

0

この問題を解決するための最良の回避策はhereです。

aNewForm.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog 
AddHandler aNewForm.SizeChanged, AddressOf Form_SizeChanged 

aNewForm.Show() 
aNewForm.WindowState = FormWindowState.Maximized 

RemoveHandler aNewForm.SizeChanged, AddressOf Form_SizeChanged 

ハンドラ

Protected Sub Form_SizeChanged(ByVal sender As Object, ByVal e As EventArgs) 

    If WindowState = FormWindowState.Maximized Then 
     If FormBorderStyle <> FormBorderStyle.Sizable Then FormBorderStyle = FormBorderStyle.Sizable 
    End If 

End Sub 
1
form.WindowState = FormWindowState.Normal 
form.Show() 
form.WindowState = FormWindowState.Maximized 
form.Show() 

私の問題を解決!

3
private void frmChild_Shown(object sender, EventArgs e) 
{ 
    // Work-around for maximized BUG 
    this.Icon = this.MdiParent.Icon; 
    this.WindowState = FormWindowState.Normal; 
    this.WindowState = FormWindowState.Maximized; 
} 
11

Calanusのソリューションへのわずかな修正:

private void MdiBase_Load(object sender, EventArgs e) 
    { 
     // Fixes bug where loading form maximised in MDI window shows incorrect icon. 
     this.Icon = Icon.Clone() as Icon; 
    } 

これは、あなたがデザイン時にアイコンを設定することができ、かつ任意のハードコードされたを必要としない(ちょうどあなたが他の形態の場合と同様)ファイルまたはリソースへのアクセス。

2

これも問題を解決することがわかりました。

myForm.WindowState = FormWindowState.Normal; 
myForm.Show(); 
myForm.WindowState = FormWindowState.Maximized; 
0

MDI子供ののForm_Loadメソッドの最初の行としてこれを追加するには、私の作品:

this.Icon = new Icon(this.Icon, this.Icon.Size); 
関連する問題