2014-07-16 93 views
0

我有以下德興控制:替代重新呈現

  • 有依賴屬性Text;
  • 此文本設置爲內部TextBlock,然後控件自動調整大小(以適合)。
  • 當這個屬性被改變時執行回調;
  • 回調我需要兩個:當前控制外觀和更改文本後(動畫)。

我現在是這樣的:

// ... do something 
textBlock.Text = Text; 
ContentText.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, (Action)delegate() { }); 
// ... do something 

不幸的是,該行(強制渲染)將拋出InvalidOperationException

同時調度處理被掛起不能執行此操作

我已經打開question關於這種情況(因此當我改變ContentControl的內容時,我使用null調用回調的原因)。

在我看來,解決方案也可以作爲重新呈現內容的替代方法。或者可能進行一些檢查以避免這種異常。

是否有任何其他方式來重新繪製(重新呈現)的內容或有沒有什麼辦法來檢查,當禁止使用調度(因爲它已被暫停)?

我只能想到添加計時器,以延遲執行,以便內容將被重新渲染。這將分成兩個邏輯:回調和定時器。而且看起來不太好看。

+1

爲什麼不直接在TextBlock上調用'Measure'然後得到它的'DesiredSize'? – Clemens

+0

您調用應該重新呈現控件的InvalidateVisual方法。你可以在這裏閱讀更多關於http://msdn.microsoft.com/en-us/library/system.windows.uielement.invalidatevisual(v=vs.110).aspx – Krishna

+0

@Krishna,'InvalidateVisual'不起作用。也許它工作異步(在wpf中的許多事情)。如果有一個事件'OnRendered',那麼我可以使用它,但是這又會將我的邏輯分成2個peaces。仍然看起來比使用計時器好得多。 – Sinatr

回答

0

感謝@Clemens,想法使用Measure似乎是一個非常好的工作解決方案。此外,這主要能夠克服許多其他問題(因爲我接觸wpf首次的時間,從來沒有消失),我已經有2少...

簡而言之:

  • 如果在不確定渲染大小,請用父容器的參數RenderSize調用Measure();
  • 然後使用DesiredSize而不是RenderSizeActualWidth/ActualHeight)。

工程就像一個魅力。 最好的部分是在家長控制上調用它,它會重新計算一切,考慮到它的孩子(就像我的情況一樣,我稱之爲我的控制措施和測量更新 TextBlock.Text)。 必須單獨要求兒童!