【问题标题】:WPF control on top of Windows controlWindows 控件之上的 WPF 控件
【发布时间】:2026-01-07 00:25:01
【问题描述】:

我有一个主窗口

<Window >
     <Canvas x:Name="topCanvas" Background="Black">
        <Grid x:Name="mainGrid" Width="{Binding ElementName=topCanvas, Path=ActualWidth}" Height="{Binding ElementName=topCanvas, Path=ActualHeight}">
  </Grid>
        <Canvas 
            Width="{Binding ElementName=topCanvas, Path=ActualWidth}"
            Height="{Binding ElementName=topCanvas, Path=ActualHeight}" 
            Name="MessageField" PreviewMouseMove="MessageField_PreviewMouseMove_1"    
            >                
        </Canvas>
    </Canvas>
</Window>

mainGrid 用于承载其他控件。基本上它有一个选项卡控件,用于承载窗口以及选项卡项中的 wpf 控件。现在我想要一个弹出控件,当它出现时应该位于所有控件之上,wpf 以及 windows 控件。

现在我有一个可以用作弹出窗口的用户控件,但该控件的问题是,它没有出现在 Windows 控件的顶部。它位于 wpf 控件之上。

 MoveableMessageBox userControl = new MoveableMessageBox();
            System.Windows.Controls.Canvas.SetZIndex(userControl, (int)1);
            MessageField.Children.Add(userControl);

请建议我怎样才能使这个控件也放在 windows 控件的顶部。

【问题讨论】:

  • 可以加截图吗?
  • 您是否考虑过从Window 而不是UserControl 派生弹出窗口并将主窗口分配给其Owner 属性?
  • @daniele3004 请查找附件中的图片
  • 您想使用自己制作的消息框吗?作为一个普通的消息框,但有你想要的内容。这是正确的? @维克拉姆
  • @daniele3004 - 是的,先生,但弹出窗口应该可以拖动到屏幕上

标签: c# wpf winforms


【解决方案1】:

听起来您只需要一个自定义对话框窗口。幸运的是,这些在 WPF 中创建起来非常简单。只需像这样扩展 Window 类:

<Window x:Class="WpfApplication2.Views.PopupWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="PopupWindow" Height="300" Width="300" Background="LightGreen" 
            WindowStyle="None" ResizeMode="NoResize">
    <Grid>
        <TextBlock Text="Message" HorizontalAlignment="Center" 
            VerticalAlignment="Center" />
    </Grid>
</Window>

public partial class PopupWindow : Window
{
    public PopupWindow()
    {
        InitializeComponent();
        PreviewMouseMove += new MouseEventHandler(PopupWindow_PreviewMouseMove);
    }

    private void PopupWindow_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (Mouse.LeftButton == MouseButtonState.Pressed) DragMove();
    }
}

DragMove 方法允许用户移动无边框的Window,它将显示在所有其他Windows 的顶部。你可以这样显示:

PopupWindow popup = new PopupWindow();
popup.ShowDialog();

当然,这是一个简单的、不完整的示例,我将由您来完成它。例如,在此Window 上没有关闭Button,因此您必须添加它(在此之前使用 ALT+F4 将其关闭)。当 Window 关闭时,您还需要返回 DialogResult 值,但您可以从 MSDN 上的 Dialog Boxes Overview 页面找到您仍然需要做的所有事情。

【讨论】:

    最近更新 更多