Popup from code behind in WPF not working ( On resize and switching windows)

GuruC picture GuruC · Nov 18, 2010 · Viewed 18.7k times · Source

I want to add a popup on click of a Button in WPF. I dont want to add Popup code in my XAML. It has to be code behind.

My XAML is as follows::

<Window x:Class="Test.Window1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="Window1" Height="300" Width="300">
   <Grid>
     <Button x:Name="button1" Click="button1_Click">Button</Button>
   </Grid>
</Window>

My XAML file has a simple button. On click of Button, I am trying to execute the following code.

  private void button1_Click(object sender, RoutedEventArgs e)
    {
        Button button = sender as Button;

        Popup codePopup = new Popup();
        TextBlock popupText = new TextBlock();
        popupText.Text = "Popup Text";
        popupText.Background = Brushes.LightBlue;
        popupText.Foreground = Brushes.Blue;
        codePopup.Child = popupText;

        codePopup.PlacementTarget = button;
        codePopup.IsOpen = true;

    }

But why is the popup not attaching itself to the window. I mean the popup is displayed even if I switch windows. Also when I resize window, Popup is no longer placed near button??

Answer

Muad&#39;Dib picture Muad'Dib · Nov 18, 2010

you have to tell the popup to display itself, too.

codePopup.IsOpen = true;

see this blog for a bit more info.

[EDIT]
basically, your popup is not "tied" (or "owned") by any parent, it is independent of any other window and/or control (etc.) Unfortunatly, there is not any easy way to get around this.

You should probably download the Popup Position Sample from MSDN here.

The code sample uses the class CustomPopupPlacement with a Rect object, and binds to horizontal and vertical offsets to move the Popup.