Изменение размера wpf

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

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

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

Ответы

Ответ 1

При изменении размера вы можете запустить таймер с коротким замыканием (скажем, 100 мсек), при каждом изменении размера reset этого таймера, чтобы он не прошел. Когда произойдет последнее изменение размера, таймер завершится, и затем вы можете нарисовать фоновое изображение.

Пример:

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

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

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

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

Здесь вы можете связать событие "Изменение размера", чтобы прекратить генерировать изображение, а в начале "Изменено" для создания изображения нового размера.

НТН

Ответ 4

Я бы использовал метод 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

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

Ответ 6

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