Wiele ludzi zastanawia się jak rozwiązać używanie MessageBoxa w wpfie. Ja proponuje ( jeśli to możliwe) wogóle go nie używać.
Zwykły MessageBox jest dosyć ograniczony, mamy do wyboru tylko parę przycisków i obrazków. W samym wpfie dodatkowo dosyć trudno rozwiązać problem otwierania messageboxa z viewmodeli, z reguły owija się go wtedy dodatkową klasą.
W wpfie proponuje zastąpić MessageBoxa przez Adornera z odpowiednią zawartością, który będzie pokazywany w widoku, którego dotyczy komunikat. Przy okazji likwiduje się też wyskakiwanie okienka na wierzch ( może to być zaleta albo wada).
Jedyne utrudnienie polega na tym,że Adorner nie pozwala na określanie swojej zawartości w XAMLu i trzeba tworzyć własną zdziedziczoną kontrolkę. Na szczęście na codeproject można znaleźć ciekawy artykuł, który pokazuje jak stworzyć kontrolkę, którą pozwala na dodanie adornera do określonych kontrolek oraz na zdefiniowanie zawartości w XAMLu:
<ac:AdornedControl IsAdornerVisible="True"> <Grid> <TextBlock TextWrapping="Wrap"> <TextBlock.Text> Lorem... </TextBlock.Text> </TextBlock> </Grid> <ac:AdornedControl.AdornerContent> <DockPanel> <DockPanel.Background> <SolidColorBrush Color="White" Opacity="0.75" /> </DockPanel.Background> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Stretch"> <TextBlock FontWeight="ExtraBold" Text="Stało się coś złego..."/> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> <TextBlock Margin="10,0,0,0"><Hyperlink>ponów</Hyperlink></TextBlock> <TextBlock Margin="10,0,0,0"><Hyperlink>konfiguracja</Hyperlink></TextBlock> </StackPanel> <Expander Header="szczegóły"> <TextBlock> <TextBlock TextWrapping="Wrap"> <TextBlock.Text> Lorem... </TextBlock.Text> </TextBlock> </TextBlock> </Expander> </StackPanel> </DockPanel> </ac:AdornedControl.AdornerContent> </ac:AdornedControl>
Jak ze wszystkim co łamie przyjętą konwencję, trzeba być ostrożnym w stosowaniu podejścia, które prezentuje w tym wpisie, jednak moim zdaniem czasem warto spróbować.
Bartek Szafko ? WPF: proponuje nie używać MessageBox-a…
Dziękujemy za publikację – Trackback z dotnetomaniak.pl…
Ciekawe podejście. Ja do tej pory używałem odpowiednio spreparowanej kontrolki Popup – http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.popup.aspx
Pozdrawiam,
Paweł
w sumie bardzo podobne do Twojego – tylko opakowane inną kontrolką 😉
btw można by dodać efekt blur do tła – mogłoby wyglądać jeszcze ciekawiej
Jeżeli pisana aplikacja może mieć minimalne wymaganie Windows Vista, to polecam zapoznać się z:
http://code.msdn.microsoft.com/VistaBridge