2011-08-05 6 views
6

.NET'in MessageBox boyutu, görüntülendiği ekranın çözünürlüğüne göre boyutunu nasıl belirler?MessageBox'un boyutu

WPF uygulaması için biraz daha esnek bir iletişim penceresi yazıyorum. Pencerenin düzeni bir Grid dışarı koydu:

+----------------- 
| auto: Header  // A header for the dialog. 
+----------------- 
| auto: Content  // can be any FrameworkElement. 
+----------------- 
| auto: BottomPanel // With buttons <OK>, <Cancel>, <Delete>, etc. 
+----------------- 

Content hücre ÇOK büyük olabilir. Kullanım durumlarımdan birinde, kullanıcı bir listeden x öğelerini silmek istiyor. Öğeler onay iletişiminde listelenir. Çok fazla sayıda eleman varsa (50'den fazla ifade edelim), pencere tadı benim için çok büyük olabilir.

Ne istiyorum Microsoft'un kendi MessageBox iletişim taklit eden bir şekilde cari ekrandan iletişim penceresinin MaxHeight ve MaxWidth özelliklerini belirleyen bir fonksiyondur.

Not: Aşağıdaki static yöntemi ile mesaj iletişimini çağırmak:

// MessageDialog class 
public static object Show(
     Window owner, 
     FrameworkElement content, 
     string title, 
     string header, 
     params MessageDialogButton[] buttons 
     ); 
/* The MessageDialogButton class has the following properties: 
* Text, ReturnValue, IsDefault, IsCancel. The class produces 
* System.Windows.Controls.Button objects that when clicked 
* return the value of their ReturnValue property--which is then 
* returned by MessageDialog::Show(...) 
*/ 

PPS: iletişim, MessageDialog pencere en Owner bulunduğu ekranını görüntülemek için ekranı belirlemek için. Geri dönüş olarak, ilk (birincil) ekran kullanılır.

+1

Sorunuzun bir cevabı değil, ancak temel olarak bir şey olan Vista + TaskDialog'a kolay erişim sağlayan [WindowsAPICodePack] (http://archive.msdn.microsoft.com/WindowsAPICodePack) adresini incelemek isteyebilirsiniz. daha çevik ve daha iyi görünümlü MessageBox gibi. Sadece Vista'da çalışır, ancak belki ihtiyaçlarınızı karşılar. –

+1

Bu her zaman MessageBox'ın yerini almaya çalışan herkes için engeldir. Otomatik ölçeklendirme, kendinizi uygulamak için önemsizdir.Bunu bir mesaj kutusu olarak düşünmeyi bırak, sadece normal bir pencere olarak düşünmeye başla. Kaydırma çubukları ve kullanıcının pencereyi yeniden boyutlandırmasını sağlamak normaldir. –

+0

Kragen'in cevabı ve Hans Passant'ın yorumu sayesinde, bir çözüm buldum: pencerenin maksimum genişlik ve yüksekliği, ekranın genişliğinin 5/8'ini ve yüksekliğinin 2/3'ü. İçerik, kullanıcının çok büyük olduğunda içeriği kaydırmasını sağlayan bir ScrollViewer içine sarılır. Tam olarak istediğim şey değil, ancak mesaj penceresinin boyutunu elde etmek için düzeni birçok kez hesaplamak için çok fazla kod yapmak istemiyorum. – Minustar

cevap

6

Windows Vista'daki according to Raymond numaralı belgede belgelenmiş bir şey bulamayacaksınız, ileti kutusu algoritması çalışma alanının içine sığacak bir kutuyla sonuçlanan aşağıdakilerden en küçüğünü seçerek ileti kutusunun genişliğini belirledi. :

  • uzun çizgi çalışma alanı çalışma alanı
  • genişliğinin
  • 3/4 genişliğinin
  • 278 DLU (Dialog units)
  • 5/8 genişliğini çalışma alanının genişliği
  • 7/8

(Bu demek INTERPRED Bu iletişim sonuçlanır sürece(), örneğin genişlik çalışma alanının genişliği 5/8 olacak çalışma alanının yüksekliğinden daha uzun, bu durumda daha geniş bir genişlik kullanacaktır).

Bu, en azından yerinde görünmeyen maksimum genişlik seçmek için bazı işaretçiler göstermelidir.

Bildiğim kadarıyla, ileti kutusunun maksimum bir yüksekliğinin olmadığının farkındayım, ancak benzer bir algoritmanın güzel çalışacağını hayal ediyorum.

Diyaloğunuz gerçekten çok büyükse, iletişim kutusunu yeniden boyutlandırılabilir/maksimize edilebilir hale getirmek isteyebilirsiniz. (Çok büyük olan ancak iletişim kutusunu daha uygun bir boyuta getirmenize izin vermeyen listeleri gösteren bir iletişim kutusu hayranı değilim).

+0

Neden son 3? Genişlik negatif değilse, bunların en küçüğü çalışma alanının genişliğinin 5/8'i kadardır. – Janiels

+3

@Jakob Ayrıca, tek tek ifadeyi de buldum, ancak iletişim kutusunun çalışma alanı için çok uzun olabileceği olasılığını hesaba katmayı düşünüyorum, bu durumda daha geniş bir diyalog genişliği seçilecektir. – Justin