Изменение размера 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