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.