我是靠谱客的博主 丰富书包,最近开发中收集的这篇文章主要介绍解决WPF加载Winform控件时的显示遮挡问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

WPF加载Winform控件时总是位于顶层,同位置处再放置WPF控件将会被遮挡。这在实际应用当中,例如:加载视频流时,总是使用Winform的PictureBox控件来显示,如果用WPF去加载这个PictureBox控件,想在上面加个控制按钮或者默认图标时就会出现这个显示层级问题。

例如窗体代码:

<Window x:Class="WpfWinformDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:WinFormHost="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:WinFormControls="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        xmlns:local="clr-namespace:WpfWinformDemo"
        mc:Ignorable="d" Loaded="Window_Loaded"
        Title="MainWindow" Height="350" Width="525">
    <Grid Margin="10">
        <WindowsFormsHost Background="Transparent">
            <WinFormControls:PictureBox x:Name="pictureBox"/>
        </WindowsFormsHost>
        <Image x:Name="imgPlay" Width="32" Height="32" Source="/Resource/paly.png" Stretch="Fill"></Image>
    </Grid>
</Window>

后台逻辑:

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.pictureBox.Image = System.Drawing.Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + @"Resourcevideo.jpg");//这里用图片模仿视频播放
            this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
        }
    }

效果,只显示PictureBox内容:

解决方案:利用WPF中Popup控件,Popup具有非常高的层级,因此可以展示在PictureBox的前面。修改窗体代码:

        <Popup AllowsTransparency="True" IsOpen="True" HorizontalOffset="25" VerticalOffset="-60">
            <Image x:Name="imgPlay" Width="32" Height="32" Source="/Resource/paly.png" Stretch="Fill"></Image>
        </Popup>

展示效果:

这时,虽然解决了层级问题,但是因为Popup控件的特殊性(类似于弹出式窗体),在拖拽窗体或者窗体被其他软件遮挡时,Popup还是呆在原来的位置。这里引用完美解决WPF中Popup控件跟随移动和始终位于最上层问题 里封装的自定义Popup控件,添加CusPopup类继承自Popup,窗体代码修改为:

        <local:CusPopup AllowsTransparency="True" IsOpen="True" HorizontalOffset="25" VerticalOffset="-60" IsTopmost="False" IsMove="True">
            <Image x:Name="imgPlay" Width="32" Height="32" Source="/Resource/paly.png" Stretch="Fill"></Image>
        </local:CusPopup>

运行效果:

 

最后

以上就是丰富书包为你收集整理的解决WPF加载Winform控件时的显示遮挡问题的全部内容,希望文章能够帮你解决解决WPF加载Winform控件时的显示遮挡问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部