The Popup control in Silverlight is not, as you might think, like a modal dialog box where other portions of the application are disabled while the dialog is displayed. It is more like an overlay where the contents of the Popup control are displayed on top of everything else in the control. However, lower level controls are still active.
If you need something more like a modal dialog box, you can simulate this in Silverlight by including a rectangle in your Popup that spans over the entire display area of the control.
I’ve taken this idea and encapsulated it into a ModalPopup control. The control can be used similarly to the Popup control, such as in the following example:
<stz:AutoSizeUserControl x:Class="Demo.ModalPopupDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:stz="clr-namespace:Stanza.Silverlight.Controls;assembly=Stanza.Silverlight.Controls" Width="800" Height="600" MinWidth="300" MinHeight="200" ExtraHeight="140" ExtraWidth="20" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid x:Name="LayoutRoot" Background="White"> <Grid> <Rectangle Stroke="#FF0000FF" RadiusX="32" RadiusY="32" StrokeThickness="2"> <Rectangle.Fill> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF000000"/> <GradientStop Color="#FFFFFFFF" Offset="1"/> </LinearGradientBrush> </Rectangle.Fill> </Rectangle> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <Button Width="140" Height="26" x:Name="showDefaultBtn" Content="Show (Fixed)"/> <Button Width="140" Height="26" x:Name="showRelativeBtn" Content="Show (Relative)"/> <Button Width="80" Height="26" x:Name="showFullScreen" Content="Full Screen"/> </StackPanel> </Grid> <stz:ModalPopup x:Name="popupPanel" Height="200" Width="220" BackgroundOpacity="0.25" BackgroundFill="Green" Left="200" Top="100" d:IsHidden="True"> <Border x:Name="popupPanelGrid" BorderThickness="4,4,4,4" Background="Green" BorderBrush="Red" Width="220" Height="200"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Ellipse Margin="10" Grid.RowSpan="2" Grid.ColumnSpan="2"> <Ellipse.Fill> <RadialGradientBrush GradientOrigin="0.25,0.25"> <GradientStop Offset="0.25" Color="White" /> <GradientStop Offset="1.0" Color="Red" /> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> <Button Width="70" Height="26" x:Name="closeBtn" Content="Close" Grid.Row="1" Grid.Column="1"/> </Grid> </Border> </stz:ModalPopup> </Grid> </stz:AutoSizeUserControl>
The popup panel itself can be opened and closed using code like:
... showRelativeBtn.Click += new RoutedEventHandler( showRelativeBtn_Click ); closeBtn.Click += new RoutedEventHandler( closeBtn_Click ); ... void showRelativeBtn_Click( object sender, RoutedEventArgs e ) { Point pt = showRelativeBtn.GetAbsolutePosition(); pt.X += showRelativeBtn.Width / 2; pt.Y += showRelativeBtn.Height / 2; popupPanel.OpenPopup( pt ); } void closeBtn_Click( object sender, RoutedEventArgs e ) { popupPanel.ClosePopup(); }
The GetAbsolutePosition() method is an extension method that allows you to get the position of the UIElement object relative to the entire Silverlight display area.
The source code can be downloaded from CodePlex.
[…] so I decided to take the work started by Page Brooks (here, here, and here) and incorporate the Modal Popup […]
Pingback by Silverlight Color Picker Control « Second Stanza — May 2, 2009 @ 2:21 pm