2016-08-17 76 views
0

我想實現一個Panel,它知道它的可見區域,將它的內容集中在Visibile區域,即使用戶滾動以查看更多內容。WPF保持UIElement集中在滾動查看器顯示的可見區域

下面是我通過重寫OnDraw的
If all visible : center

Protected Overrides Sub OnDraw(graphics As GraphicsCache, area As RectangleF) 
    brush = graphics.BrushsCache.GetBrush(ForeColor) 
    Dim r = RectangleF.Intersect(graphics.Graphics.ClipBounds, area) 
    graphics.Graphics.DrawString(Value, Font, brush, r, StringFormat) 
End Sub 

enter image description here

我試圖從面板繼承和覆蓋諸如ArrangeOverride一些事件上的winform做想要的行爲的一個例子,但是當我將它放置在ScrollViewer中時,它們似乎不會被觸發。

我有一個印象,我應該遠離WPF中的OnRender,所以有辦法達到預期的效果嗎?

編輯:

爲了澄清,在下面的圖像,還有八月和但網格/邊框/月,包含文本塊足夠多的空間來顯示,是不是圍繞它的可視區域 enter image description here

+0

爲什麼不放置面板(例如,一個網格)與一個TextBlock在ScrollViewer之上? – Clemens

+0

@Clemens那麼,如果我把一個帶有textAlign的文本塊放到一個網格中,它就可以很好地工作_當網格完全可見時 - 當我們說一半的網格被scrollviewer剪切時,文本塊是一半可見的......但是也許我不明白你的意思**頂部**? – Linken

+0

如果你已經子類化了一個面板,你還應該實現IScrollInfo來解決「當我把它放在Scroll ...中時似乎不會觸發」的問題。如果你這樣做,你將包含滾動事件到WPF面板的佈局機制中。當然,添加例程來實現目標。 – tgpdyk

回答

0

你可以把面板上的ScrollViewer中的頂部一個TextBlock:

<Grid> 
    <ScrollViewer> 
     ... 
    </ScrollViewer> 
    <Grid IsHitTestVisible="False"> 
     <TextBlock Text="Hello, World." 
        HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    </Grid> 
</Grid> 
+0

好吧,但我想這個失敗了滾動查看器的目的。我編輯了我的問題來澄清。 – Linken