wpf изменение размера завершено - PullRequest
14 голосов
/ 12 января 2010

Так что мне нужно процедурно сгенерировать фоновое изображение для сетки, это займет всего 1 сек.

Так что я могу подключиться к событию SizeChanged, но затем, когда вы изменяете размер диаграммы, она запускается и запускает даже, может быть, 30 раз в секунду, поэтому событие изменения размера значительно отстает.

Кто-нибудь знает хороший способ подключиться к событию resize и проверить погоду, когда использование завершено, я попытался просто проверить состояние мыши вверх / вниз, но когда срабатывает событие resize, мышь почти всегда выключена.

Ответы [ 6 ]

22 голосов
/ 12 января 2010

При изменении размера вы можете запустить недолговечный таймер (скажем, 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();
}
5 голосов
/ 11 июня 2015

Вот чистое решение:

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;
}

Удачи!

2 голосов
/ 18 января 2012

Для .Net 3.5 и более поздних версий Пит Браун описывает решение с прикрепленным свойством, используя Blends System.Windows.Interactivity.dll.

Там вы можете подключить событие Resizing, чтобы прекратить генерировать ваше изображение, и в событии Resized начать генерировать изображение для нового размера.

НТН

1 голос
/ 17 января 2013

Я бы использовал метод 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
}
0 голосов
/ 05 июня 2012

Лучшее решение - дважды вызвать "GenerateImage ()" в обработчике событий с измененным размером

0 голосов
/ 12 января 2010

Вам нужно увидеть изменение размера изображения? Вы можете обработать изменение размера и повторно визуализировать изображение при наведении мыши вверх.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...