2011-12-20 25 views
2

我有一個前幾天做了一個自定義WPF控件:無效自己的WPF控件

public class MapContext : FrameworkElement{ 
    //.... 
     protected override void OnRender(DrawingContext dc) { 
     // Draw the map 
     if (mapDrawing != null) dc.DrawDrawing(mapDrawing); 
} 

mapDrawing繪圖在另一個線程所有以顯示幾何計算更新,該線程將更新用戶界面通過調用InvalidateVisual()

Application.Current.Dispatcher.Invoke(DispatcherPriority.Render, new Action(delegate { InvalidateVisual(); })); 

InvalidateVisualMSDN documentation說:

使元素的渲染無效,並強制完成新的佈局傳遞。 OnRender在佈局週期完成後調用。

這不是我想要的行爲,因爲MapContext控件佈局沒有改變。只有裏面的圖紙已經改變。

問題 有沒有做一個完整的佈局通過被稱爲強迫OnRender方法的正確方法?

在此先感謝

回答

2

不,沒有辦法強制重新渲染沒有佈局傳遞。 由於WPF使用保留模式系統,OnRender()不能像舊的WinAPI那樣工作。 OnRender()僅存儲一組繪圖指令,WPF確定如何以及何時進行實際呈現。

如果您需要獨立改變控件的大小,我建議您使用類似DrawingVisual的東西,並在您想要更改時使用RenderOpen()添加您的mapDrawing。

+0

這正是我的問題的方法,但在某些時候我需要將這些DrawingVisuals扔到用戶界面。請參閱我的帖子在這裏http://stackoverflow.com/questions/8521789/data-binding-performance-issues – GETah

+0

不知道爲什麼你轉換爲位圖? DrawingVisual是可見元素的最低級別。可見的一切都源於它,因此要在屏幕上顯示一個,只需將其設置爲Window,Panel或其他ContentPresenter的Content屬性。 – GazTheDestroyer

+0

我的地圖不是靜態的,圖形每秒變化5次,所以我認爲在處理下一個視圖時準備顯示位圖會很好。 – GETah

1

也許,而不是使用自己的控制,你可以畫圖像與您的地圖,並設置該圖像源標準控制?像繪圖這樣的操作通常需要一些時間,所以它更好地在後臺準備圖像,然後將其切換爲當前顯示的圖像。

+0

感謝您的快速回復。這是我最初做的,但表現非常糟糕。請參閱我的帖子http://stackoverflow.com/questions/8521789/data-binding-performance-issues – GETah