WPF Popup: как поместить границу вокруг всплывающего окна?

У меня есть Popup в моем XAML, чтобы показать некоторую информацию. Когда окно появляется, оно не имеет значения Border и, как представляется, вставляется в Background страницы. Для этого просто нужен Border, а в идеале - затененная тень за ним, чтобы показать своеобразное расслоение и фокус.

Любые идеи о том, как создать Popup, чтобы иметь границу и, возможно, теневой эффект?

Ответы

Ответ 1

Спасибо, я закончил тем, что сделал это 3D-подобным (чуть-чуть), установив границу как:

 <Border BorderBrush="White" BorderThickness="3,3,0,0">
            <Border BorderBrush="Black" BorderThickness="1,1,3,3">
</Border>
</Border>

Выглядит довольно прилично!

Ответ 2

На мой взгляд, гораздо проще поместить маржу вокруг всплывающей границы, достаточно большой для DropShadowEffect, т.е.

<Border ... Margin="0 0 8 8">
    <Border.Effect>
        <DropShadowEffect ... />
    </Border.Effect>
    <!-- Popup Content Here -->
</Border>

Всплывающее окно должно допускать прозрачность, то есть AllowsTransparency = True.

Ответ 3

<Popup PopupAttributes="SetByYou">
 <Border BorderAttribute="SetByYou">
  <!-- Content here -->
 </Border>
</Popup>

Ответ 4

По-видимому, всплывающие окна в настоящее время не поддерживают тени, см. ссылку.

Однако, я придумал обходное решение, которое работает довольно хорошо ИМО. В основном идея состоит в том, чтобы Canvas вложен в другой прозрачный холст и просто применил тень к вложенному холсту. Просто. Вот пример:

        <Grid>
        <TextBox x:Name="MyTxtBx" Width="50" 
                 Height="20" Text="Hello"/>
        <Popup IsOpen="True" Width="200" Height="100" 
               PlacementTarget="{Binding ElementName=MyTxtBx}" 
               AllowsTransparency="True" >
            <Canvas Background="Transparent">
                <Canvas Background="Green" Width="150" Height="50">
                    <Canvas.BitmapEffect>
                        <DropShadowBitmapEffect Softness=".5" 
                                                ShadowDepth="5" 
                                                Color="Black"/>
                    </Canvas.BitmapEffect>
                    <Label Content="THIS IS A POPUP TEST"/>
                </Canvas>
            </Canvas>
        </Popup>
    </Grid>

Следует отметить, что вложенный холст должен быть меньше размера контейнера. Также необходимо установить AllowsTransparency.