代码之家  ›  专栏  ›  技术社区  ›  Joel Barsotti

WPF调整大小完成

  •  14
  • Joel Barsotti  · 技术社区  · 16 年前

    所以我需要程序化地生成一个网格的背景图像,它只需要.1秒。

    所以我可以连接到sizechanged事件中,但是当您调整图表的大小时,它会每秒触发甚至30次,因此调整大小事件会明显滞后。

    有没有人知道一个很好的方法来连接到调整大小事件和测试是否使用完成了调整大小,我试图简单地检查鼠标的上/下状态,但当调整大小事件激发鼠标几乎总是下。

    6 回复  |  直到 11 年前
        1
  •  22
  •   Aviad P.    16 年前

    在调整大小时,您可以启动一个短时间计时器(比如100毫秒),每次调整大小时,都会重置该计时器以防止其流逝。当最后一次调整大小发生时,计时器将消逝,然后您可以绘制背景图像。

    例子:

    Timer resizeTimer = new Timer(100) { Enabled = false };
    
    public Window1()
    {
        InitializeComponent();
        resizeTimer.Elapsed += new ElapsedEventHandler(ResizingDone);
    }
    
    void ResizingDone(object sender, ElapsedEventArgs e)
    {
        resizeTimer.Stop();
        GenerateImage();
    }
    
    private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        resizeTimer.Stop();
        resizeTimer.Start();
    }
    
        2
  •  5
  •   mca    11 年前

    清洁溶液如下:

    private const int WmExitSizeMove = 0x232;
    
    private void OnLoaded(object sender, RoutedEventArgs args)
    {
        var helper = new WindowInteropHelper(this);
        if (helper.Handle != null)
        {
            var source = HwndSource.FromHwnd(helper.Handle);
            if (source != null)
                source.AddHook(HwndMessageHook);
        }
    }
    
    private IntPtr HwndMessageHook(IntPtr wnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        switch (msg)
        {
            case WmExitSizeMove:
                // DO SOMETHING HERE
                handled = true;
                break;
        }
        return IntPtr.Zero;
    }
    

    祝你好运!

        3
  •  2
  •   gumo    14 年前

    对于.NET 3.5和更高版本的皮特·布朗 describes 使用混合系统.windows.interactivity.dll具有附加属性的解决方案。

    您可以在那里连接调整大小事件以停止生成图像,并在调整大小的事件中开始生成新大小的图像。

    高温高压

        4
  •  1
  •   hypehuman    13 年前

    我将使用Dispatcher.BeginInvoke方法。这将确保只有在应用程序有时间处理图像时才生成图像。

    private bool _generateImageReqested = false;
    
    private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (!_generateImageReqested)
        {
            _generateImageReqested = true;
            Dispatcher.BeginInvoke(new Action(GenerateImage), DispatcherPriority.ApplicationIdle);
        }
    }
    
    private void GenerateImage()
    {
        _generateImageReqested = false;
    
        // resize your image here
    }
    
        5
  •  0
  •   Gus    16 年前

    是否需要查看图像大小调整?您可以处理“鼠标向上移动时调整大小并重新渲染图像”事件。

        6
  •  0
  •   Zahid Sattar    14 年前

    最好的解决方案是在sizeChanged事件处理程序中调用“generateimage()”两次

    推荐文章