Creating popup windows in XBAP applications

A colleague at DevelopMentor recently asked me about creating popup windows in XAML browser applications (XBAP). Normally this is not allowed – if you try to create a top-level window you will get a SecurityException because WPF asks forUIPermission which is strictly prohibited when hosted in the browser.

It turns out, however, that you can get a popup window – there’s a hidden little gem in theSystem.Windows.Controls.Primitive namespace that is your friend: Popup.

It’s the same underlying class that ToolTip, Menu, and ComboBox use to display drop-down menus and overlays and it is browser-hosting aware! It’s pretty limited in functionality – I’m not sure you can get it to move around with the mouse for example, but for simple cases it works great. Here’s a code snippet – wire this up to a button in an XBAP:
 

复制代码
void OnClick(object sender, EventArgs e)
{
    Popup window = new Popup();
   
    StackPanel sp = new StackPanel { Margin = new Thickness(5) };
    sp.Children.Add(new TextBlock { Text = "Hi from a popup" });
    Button newButton = new Button { Content = "Another button" };
    newButton.Click += delegate { window.IsOpen = false; };
    sp.Children.Add(newButton);
    sp.Children.Add(new Slider { Minimum = 0, Maximum = 50, Value = 25, Width = 100 });
   
    window.Child = new Border { Background = Brushes.White, BorderBrush = Brushes.Black, 
                                     BorderThickness = new Thickness(2), Child = sp };
    window.PlacementTarget = this;
    window.Placement = PlacementMode.Center;
   
    window.IsOpen = true;
 }
复制代码

The key thing you need to do is set the PlacementTarget. That associates a “parent” window and without it, the Popup class asserts UIPermission which will fail in the browser environment.

posted @   遥望星空  阅读(293)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示