2010-01-12 72 views
13

因此,我需要爲網格程序性地生成背景圖像,它只需要0.1秒。wpf調整大小完成

所以我可以連接到SizeChanged事件,但是當你調整圖表大小時,它會每秒觸發30次,所以resize事件會顯着延遲。

有沒有人知道連接到resize事件和測試天氣的好方法,使用已完成調整大小,我試着簡單地檢查鼠標上/下狀態,但是當resize事件觸發鼠標幾乎總是下降。

+0

圖像的性質是什麼?它是一個光柵或矢量圖像?原因是可能有更好的方法,這取決於你想要做什麼的性質。 – codekaizen 2010-01-12 05:05:20

+0

這是光柵,是基於一些有些複雜的數學。我並不完全熟悉矢量藝術的功能,但現在我們假設它不能在xaml中完成。 – 2010-01-12 05:35:35

+0

@JoelBarsotti:最好的解決方案是在sizechanged事件處理程序 – 2012-06-04 20:24:17

回答

21

在調整大小時,您可以啓動一個短暫計時器(比如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(); 
} 
+1

中兩次調用「GenerateImage()」,這看起來有點像黑客攻擊,但是嘿,破解原始代碼的工作更好。 – 2010-01-12 06:41:23

+1

@Joel,我想這是唯一最簡單的方法,因爲窗口大小調整實際上是由Window Chrome實現的,它不是WPF在本機窗口中的一部分,所以您不會得到任何這種鼠標上移事件。另一種方法是創建您自己的Window Chrome,您自己的窗口樣式無邊框,並且您需要重新創建整個窗口框架並編寫鼠標事件代碼。 – 2010-01-12 07:07:50

+0

如果10行代碼幾乎相同,並且1000行代碼,我將全部爲最簡單,破解或不破解,我將每次採用10行代碼。 – 2010-01-12 23:43:55

0

你需要看到的圖像大小調整?您可以處理調整大小並在鼠標移動事件中重新渲染圖像。

+0

這是我的第一個想法,但是當我嘗試它時,我無法弄清楚如何捕獲正確的mouseup事件,我是一種WPF newb,我是猴子在某人elses代碼。我正在處理的代碼作爲一個子元素插入到另一個對象中。我的理解是有冒泡和隧道路由事件,我需要做的是趕上隧道版本。我的理解是,這些事件通常有一個預覽前綴,我沒有看到一個用於mouseleftbuttonup。 – 2010-01-12 06:37:20

+0

我發現了.PreviewMouseLeftButtonUpEvent事件,但是當我完成調整大小時它似乎不會觸發。 – 2010-01-12 06:39:54

2

對於.Net 3.5及更高版本Pete Brown describes解決方案使用混合System.Windows.Interactivity.dll附加屬性。

在那裏,您可以連線Resizing事件以停止生成圖像,並在Resized事件中開始爲新尺寸生成圖像。

HTH

0

最佳解決方案是在事件處理程序SizeChanged將

1

我會使用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 
} 
4

這裏是乾淨的解決方案:

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

祝你好運!