WPF: proponuje nie używać MessageBox-a

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ć.

imageZwykł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).

image

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ć.

Tagged , ,

4 thoughts on “WPF: proponuje nie używać MessageBox-a

  1. Bartek Szafko ? WPF: proponuje nie używać MessageBox-a…

    Dziękujemy za publikację – Trackback z dotnetomaniak.pl…

  2. Paweł says:

    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ł

  3. 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

  4. migotekm says:

    Jeżeli pisana aplikacja może mieć minimalne wymaganie Windows Vista, to polecam zapoznać się z:

    http://code.msdn.microsoft.com/VistaBridge

Leave a Reply

Your email address will not be published. Required fields are marked *