Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不干扰WPF的情况下持续使表单控件无效?_C#_Wpf_Repaint_Invalidation - Fatal编程技术网

C# 如何在不干扰WPF的情况下持续使表单控件无效?

C# 如何在不干扰WPF的情况下持续使表单控件无效?,c#,wpf,repaint,invalidation,C#,Wpf,Repaint,Invalidation,我有一个在WindowsFormsHost中的控件。此控件用于OpenGL上下文中的绘图内容,需要在每次绘图后使其无效 问题是:如果我这样做的话,WPF控件将不再作出反应。你可以点击它们,它们就可以工作了,但是你不会得到任何视觉反馈,就像你把鼠标悬停在上面或者按下WPF按钮一样。如果将鼠标悬停在该按钮上,则该按钮不会改变颜色或正常情况下的颜色 我为你制作了一个小复制品: XAML 如果你点击WPF按钮,你将不会得到任何你点击该按钮的视觉反馈 问题 我如何才能像在复制中一样在窗口窗体中使用连续无效

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

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

我为你制作了一个小复制品:

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

问题 我如何才能像在复制中一样在窗口窗体中使用连续无效,而不丢失按钮上的视觉反馈?

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

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

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

我猜,您正在使用100%的UI线程。尝试使用Application.DoEvents或使WinForms控件无效的频率降低,例如在计时器循环中进行节流。另一个想法是,您可以在CompositionTarget.Rendering事件中使WinForms OpenGL控件无效,该事件在WPF绘制到屏幕时发生。这确保了WinForms中的重绘不会比WPF绘制的速度快。真正的问题是为什么每次绘制后都需要使控件无效?这应该是不必要的,这表明控件中存在设计错误。@RedSerpent我的控件应该每秒至少更新60次,以获得平滑的帧速率。也许我可以把它限制在这个范围内,而不是尽可能快地画出来。但是我更愿意尽可能快地渲染图像。@Dr.ABT我测试了你的想法:事件会使我的应用程序在短时间内冻结。但是CompositionTarget.Rendering可以工作。我现在不确定我是否失去了使用OpenGL而不是WPF 3D的优势。。。我希望不是:这都是我的错。我开发了一个图表库,我们成功地在CompositionTarget.Rendering中触发了DirectX11绘图,效果很好。我们使用节流。只有当鼠标拖动或模型更改且CompositionTarget事件已触发时,我们才重新绘制DX曲面。请确保取消订阅,因为CompositionTarget.Rendering事件处理程序可能导致内存泄漏。
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();
    }
Constructor()
{
  CompositionTarget.Rendering += CompositionTarget_Rendering;
}

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