2014-09-25 107 views
2

背景:
我將一個控件從WinForms轉換爲WPF。在WinForms中,我覆蓋了一個PictureBox並使用OnPaint事件來繪製我需要的控件。該控件將處理所有的雙緩衝​​和裁剪。如何使用OnRender事件,但只呈現給WPF中的控制區域?

我將控件轉換爲WPF,並且現在從Canvas繼承。我重寫OnRender事件和繪圖一切交給的DrawingContext,但它看起來像的DrawingContext讓我過去控制繪製到視圖的其餘部分:

Render example

在上圖中固體暗粉色框是控件,淺粉紅色框和綠色線繪製在(0,0)處,但藍色框繪製在(0,-100)處。

在WinForms中,PictureBox會剪裁任何不在控件區域中的東西。

此外,我發現如果盒子落在控件下方,藍色盒子會被裁剪。我認爲這是因爲它確實夾在封閉網格下面,但我不確定。

問題:

  1. 究竟什麼是做的DrawingContext,我爲什麼可以借鑑過去的我 控制?
  2. 如何在WPF中使用正確的 裁剪來實現相同的功能?我是否需要重寫不同的功能,繪製不同的方式,或者是否有某種方法可以將我的 控件的OnRender方法中的圖形限制到特定區域?
  3. 有沒有更好的方法來實現我正在嘗試做的事情(使用正確的剪裁和雙緩衝對控件進行任意繪製)?

我嘗試向Canvas子項添加形狀,但是這非常緩慢。

+0

剛一說明:爲了通過覆蓋的OnRender你不需要從畫布派生來實現自定義的渲染。 FrameworkElement甚至UIElement應該足夠了。但是,您需要將ClipToBounds設置爲true。 – Clemens 2014-09-25 21:00:18

+0

@Clemens,如果我重寫其中的任何一個,它會處理雙緩衝嗎?在WinForms中,如果我覆蓋Panel控件,則沒有雙緩衝,但PictureBox在控件中有雙緩衝處理。我將使用像CAD視圖這樣的控件,允許用戶通過縮放和平移等來移動和更改其內部的東西。 – 2014-09-25 21:17:35

+0

WPF中沒有(內置)雙緩衝。請參閱[這裏](http://stackoverflow.com/a/1672595/1136211)。 – Clemens 2014-09-25 21:21:10

回答

2

該問題與Canvas如何呈現內容有關。這意味着它的孩子可以在其實際區域之外渲染。然而,你可以通過屬性 ClipToBounds設置爲true避免默認行爲:

yourCanvas.ClipToBounds = true; 
相關問題