WPF сохраняет UIElement по центру видимой области, отображаемой средством просмотра прокрутки

Я хотел бы реализовать Panel, осведомленную о своей видимой области, центрируя ее содержимое в видимой области, даже когда пользователь прокручивает, чтобы увидеть больше содержимого.

Вот пример желаемого поведения, которое я сделал в winform, переопределив OnDraw
< img src="https://i.stack.imgur.com/wL14c.jpg" alt="Если все видно: по центру">

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

введите здесь описание изображения

Я попытался наследовать от панели и переопределить некоторые события, такие как ArrangeOverride, но они, похоже, не срабатывают, когда я помещаю их в ScrollViewer.

У меня сложилось впечатление, что я должен держаться подальше от OnRender в WPF, так есть ли способ добиться желаемого эффекта?

РЕДАКТИРОВАТЬ :

Чтобы уточнить, на изображении ниже более чем достаточно места для отображения августа и ноября, но сетка/граница/холст, содержащий Текстовый блок, не центрирует его в видимой области введите здесь описание изображения


person Linken    schedule 17.08.2016    source источник
comment
Почему бы не разместить панель (например, сетку) с текстовым блоком поверх ScrollViewer?   -  person Clemens    schedule 17.08.2016
comment
@Clemens Хорошо, если я поместил текстовый блок с textAlignement в сетку, он отлично работает, когда сетка полностью видна, когда, скажем, половина сетки обрезается средством просмотра прокрутки, текстовый блок виден наполовину. .. но, может быть, я не понимаю, что вы подразумеваете под сверху?   -  person Linken    schedule 17.08.2016
comment
Если вы уже создали подкласс панели, вам также необходимо реализовать IScrollInfo, чтобы адрес не срабатывал, когда я помещаю его в задачу Scroll.... Если вы это сделаете, вы включите события прокрутки в механизм макета панели WPF. И, конечно же, добавьте подпрограммы для достижения цели.   -  person tgpdyk    schedule 17.08.2016
comment
@tgpdyk, чего я не понимаю (я пробовал интерфейс IScrollInfo), так это того, что UIElement внутри ScrollViewer даже не вызывает субпрограмму OnRender при прокрутке. Я предполагаю, что мне нужно будет перерисовать объект, чтобы получить эффект, который я хочу.   -  person Linken    schedule 17.08.2016
comment
Вы должны поместить это на панель OnArrange текстового блока, а не на Onrender. Да, это утомительно.   -  person tgpdyk    schedule 17.08.2016


Ответы (1)


Вы можете поместить панель с TextBlock поверх ScrollViewer:

<Grid>
    <ScrollViewer>
        ...
    </ScrollViewer>
    <Grid IsHitTestVisible="False">
        <TextBlock Text="Hello, World."
                   HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Grid>
person Clemens    schedule 17.08.2016
comment
хорошо, но я думаю, что это противоречит цели наличия прокрутки. Я отредактировал свой вопрос, чтобы уточнить. - person Linken; 17.08.2016