如何在不干扰WPF的情况下使Forms控件连续失效

本文关键字:Forms 控件 连续 失效 情况下 干扰 WPF | 更新日期: 2023-09-27 18:24:17

我有一个位于WindowsFormsHost中的控件。此控件用于在OpenGL上下文中绘制内容,每次绘制后都需要使其无效。

问题是:如果我这样做的话,WPF控件就不会再做出反应了。你可以点击它们,它们就会工作,但你不会得到任何视觉反馈,比如当你把鼠标悬停在上面或按下WPF按钮时。如果你把鼠标悬停在按钮上,按钮不会改变颜色或正常情况下会改变的东西。

我为你创建了一个小repro:

XAML

<Grid>
  <WindowsFormsHost x:Name="uxContainerWindowsFormsHost" HorizontalAlignment="Left" Height="163" Margin="101,29,0,0" VerticalAlignment="Top" Width="223"/>
  <Button Content="Button" HorizontalAlignment="Left" Margin="225,260,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>

代码

public MainWindow()
    {
        InitializeComponent();
        var b = new System.Windows.Forms.Button();
        b.BackColor = System.Drawing.Color.Gray;
        b.Text = "Button";
        b.Paint += b_Paint;
        uxContainerWindowsFormsHost.Child = b;
    }
    void b_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        (sender as System.Windows.Forms.Button).Invalidate();
    }

如果你点击WPF按钮,你将不会得到任何你点击按钮的视觉反馈。

问题

我如何在WindowsFormsHost中使用连续无效,就像在repo中一样,而不会失去按钮上的视觉反馈?

如何在不干扰WPF的情况下使Forms控件连续失效

解决方案是ABT博士在评论中显示的CompositionTarget.Rendering事件。

Constructor()
{
  CompositionTarget.Rendering += CompositionTarget_Rendering;
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
  _myControl.Invalidate();
}