【问题标题】:How do I raise an event when a WPF control ( Image control) is redrawn?重绘 WPF 控件(图像控件)时如何引发事件?
【发布时间】:2019-01-04 09:43:44
【问题描述】:

我有一个处理图片框的绘制事件的 winforms 绘制事件处理程序。正如绘制事件描述所说,“......当重绘控件时触发事件”。我不太明白这一点,我希望在 WPF 中的 Image 控件上引发相同的事件。但我找不到任何此类事件。这是winforms代码

如何在 WPF 中执行此操作??

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (pictureBox1.Image != null)
    {
        if (temprect != new Rectangle())
        {
            e.Graphics.DrawRectangle(new Pen(selectionBrush, 2), temprect);
        }
    }
    else
    {
        using (Font myFont = new Font("Arial", 40, FontStyle.Bold))
        {
            e.Graphics.DrawString("No Image", myFont, Brushes.LightGray,
                new Point(pictureBox1.Width / 2 - 132, pictureBox1.Height / 2 - 50));
        }
    }
}

我已经使用 DrawingContext 类将事件 Hanlder 中的所有代码转换为 WPF。现在,我只需要对可以引发“重绘图像控件时”的事件的帮助。

【问题讨论】:

  • 为什么要举办这个活动?您可以创建与 winforms 中相同的event(使用EventHandler<T>),还是您想要特定于 wpf 的routed eventdifference)?或者你只是想做custom painted control
  • 正如绘制事件的描述(不是非常丰富的信息)所说,“当图片框被重新绘制时引发事件”。所以我的问题是我找不到在控件被 REDRAWN 时引发的任何 WPF 等效事件。我尝试在 Image 控件上使用 SourceUpdated 事件,但它从未引发。
  • WPF 在其 UI 中使用不同于 winforms 的 architecture。你没有解释你为什么想要这个活动。做什么?如果您只是想画一两条线,那么添加一两条线是一种可能性,它们通常在 xaml(资源字典)中定义为控件模板,但后面的代码也很好(参见我之前评论中的链接)。
  • Wpf 控件 提供“Initialized”、“Loaded”、“ManipulationCompleted”等事件。只需尝试重绘时触发哪一个即可。

标签: c# wpf winforms paintevent


【解决方案1】:

WPF 不使用 WinForm 的按需模式绘画。只要布局系统想要元素“重绘”自身,就会调用UIElementOnRender 方法。你可以在你的类中重写这个方法:

public class YourElement : FrameworkElement
{
    protected override void OnRender(DrawingContext dc)
    {
        base.OnRender(dc);
    }
}

如果你想明确地重新渲染元素,你可以调用InvalidateVisual() 方法。

【讨论】:

  • 这很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多