因此,我需要爲網格程序性地生成背景圖像,它只需要0.1秒。wpf調整大小完成
所以我可以連接到SizeChanged事件,但是當你調整圖表大小時,它會每秒觸發30次,所以resize事件會顯着延遲。
有沒有人知道連接到resize事件和測試天氣的好方法,使用已完成調整大小,我試着簡單地檢查鼠標上/下狀態,但是當resize事件觸發鼠標幾乎總是下降。
因此,我需要爲網格程序性地生成背景圖像,它只需要0.1秒。wpf調整大小完成
所以我可以連接到SizeChanged事件,但是當你調整圖表大小時,它會每秒觸發30次,所以resize事件會顯着延遲。
有沒有人知道連接到resize事件和測試天氣的好方法,使用已完成調整大小,我試着簡單地檢查鼠標上/下狀態,但是當resize事件觸發鼠標幾乎總是下降。
在調整大小時,您可以啓動一個短暫計時器(比如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();
}
中兩次調用「GenerateImage()」,這看起來有點像黑客攻擊,但是嘿,破解原始代碼的工作更好。 – 2010-01-12 06:41:23
@Joel,我想這是唯一最簡單的方法,因爲窗口大小調整實際上是由Window Chrome實現的,它不是WPF在本機窗口中的一部分,所以您不會得到任何這種鼠標上移事件。另一種方法是創建您自己的Window Chrome,您自己的窗口樣式無邊框,並且您需要重新創建整個窗口框架並編寫鼠標事件代碼。 – 2010-01-12 07:07:50
如果10行代碼幾乎相同,並且1000行代碼,我將全部爲最簡單,破解或不破解,我將每次採用10行代碼。 – 2010-01-12 23:43:55
你需要看到的圖像大小調整?您可以處理調整大小並在鼠標移動事件中重新渲染圖像。
這是我的第一個想法,但是當我嘗試它時,我無法弄清楚如何捕獲正確的mouseup事件,我是一種WPF newb,我是猴子在某人elses代碼。我正在處理的代碼作爲一個子元素插入到另一個對象中。我的理解是有冒泡和隧道路由事件,我需要做的是趕上隧道版本。我的理解是,這些事件通常有一個預覽前綴,我沒有看到一個用於mouseleftbuttonup。 – 2010-01-12 06:37:20
我發現了.PreviewMouseLeftButtonUpEvent事件,但是當我完成調整大小時它似乎不會觸發。 – 2010-01-12 06:39:54
對於.Net 3.5及更高版本Pete Brown describes解決方案使用混合System.Windows.Interactivity.dll附加屬性。
在那裏,您可以連線Resizing事件以停止生成圖像,並在Resized事件中開始爲新尺寸生成圖像。
HTH
最佳解決方案是在事件處理程序SizeChanged將
我會使用Dispatcher.BeginInvoke方法 「GenerateImage()」 調用兩次。這將確保您的圖像僅在應用程序有時間處理時生成。
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
}
這裏是乾淨的解決方案:
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;
}
祝你好運!
圖像的性質是什麼?它是一個光柵或矢量圖像?原因是可能有更好的方法,這取決於你想要做什麼的性質。 – codekaizen 2010-01-12 05:05:20
這是光柵,是基於一些有些複雜的數學。我並不完全熟悉矢量藝術的功能,但現在我們假設它不能在xaml中完成。 – 2010-01-12 05:35:35
@JoelBarsotti:最好的解決方案是在sizechanged事件處理程序 – 2012-06-04 20:24:17