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

时间:2014-09-25 09:28:25

标签: c# wpf repaint invalidation

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

问题:如果我这样做,WPF控件不再响应了。您可以单击它们并且它们可以正常工作,但是当您将鼠标悬停在其上或按下WPF按钮时,您不会获得任何视觉反馈。如果将鼠标悬停在按钮上,按钮不会改变颜色或正常情况下的颜色。

我为你创建了一个小副本:

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中使用持续失效,就像在repro中一样,而不会丢失按钮上的视觉反馈?

1 个答案:

答案 0 :(得分:0)

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

Constructor()
{
  CompositionTarget.Rendering += CompositionTarget_Rendering;
}

void CompositionTarget_Rendering(object sender, EventArgs e)
{
  _myControl.Invalidate();
}