2013-09-11 4 views
4

У меня есть TextBlock, который может содержать длинный текст, поэтому я хочу добавить к нему вертикальную полосу прокрутки. Моя первоначальная попытка состояла в том, чтобы обернуть вокруг него ScrollViewer. Это работает, но проблема в том, что когда я увеличиваю масштаб, ширина также увеличивается. Я попытался отключить горизонтальную полосу прокрутки, как это:TextBlock с вертикальной полосой прокрутки

<ScrollViewer IsTabStop="True" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">

Но это не решило проблему. Я также попытался связывание ширина:

Width="{Binding ElementName=Scroller, Path=ViewportWidth}"

Это не помогло.

Итак, мой вопрос в том, как добавить вертикальную полосу прокрутки к нему, но иметь фиксированную ширину и обернутый текст для TextBlock внутри? Вот мой полный код:

<ScrollViewer Grid.Row="1" IsTabStop="True" VerticalScrollBarVisibility="Auto"> 
      <TextBlock HorizontalAlignment="Center" VerticalAlignment="Top" TextWrapping="Wrap" TextAlignment="Center"/> 
</ScrollViewer> 
+0

Как вы «приближаетесь»? У вас есть 'viewbox', обернутый вокруг вашего' scrollviewer'? – Stewbob

+0

Нет. Я просто Ctrl + Прокрутка для увеличения. У меня нет «ViewBox» –

ответ

4

Там две части этого ответа ... во-первых, просто использовать TextBox:

<TextBox ScrollViewer.VerticalScrollBarVisibility="Visible" Text="Something really 
    really really really really really really really really long" 
    Style="{StaticResource TextBlockStyle}" /> 

Вторая часть это просто StyleTextBox так, что она выглядит подобно TextBlock:

<Style x:Key="TextBlockStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Background" Value="{x:Null}" /> 
    <Setter Property="BorderBrush" Value="{x:Null}" /> 
    <Setter Property="BorderThickness" Value="0" /> 
    <Setter Property="Padding" Value="0" /> 
    <Setter Property="IsReadOnly" Value="True" /> 
    <Setter Property="IsTabStop" Value="False" /> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
    <Setter Property="SnapsToDevicePixels" Value="True" /> 
    <Setter Property="TextWrapping" Value="Wrap" /> 
    <Style.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Background" Value="{x:Null}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Вы можете удалить любой из этих свойств, если они не подходят вашей ситуации.

+0

Спасибо. Я изменю элемент управления на «TextBox» –

1
<TextBox HorizontalAlignment="Center" 
    VerticalAlignment="Top" 
    TextWrapping="Wrap" 
    TextAlignment="Center" 
    VerticalScrollBarVisibility="Auto" Width="300" Style="{StaticResource TextBlockStyle}"/> 

Вам не нужно ScrollViewer обернутый в TextBox, контроль TextBox имеет свой собственный ScrollViewer. И вам нужно определить ширину TextBox, чтобы полоса прокрутки знала свою фиксированную ширину и обертывала текст.

Затем вы должны стилизовать TextBox, чтобы выглядеть как TextBlock

хорошая причина, почему это ScrollViewer не будет работать в соответствии с Ifeanyi Echeruo от Microsoft, от MSDN

ScrollViewer сначала спрашивает его содержание, насколько велико было бы в отсутствие ограничений, если для контента требуется больше места, чем , тогда у зрителя есть время, чтобы произвести удар в некоторых ScrollBars

В отсутствие ограничений TextBlock всегда будет возвращать размер , где весь текст подходит для одной строки.

ScrollViewer с ScrollBars никогда не получит TextBlock для обертывания.

Однако вы можете быть в состоянии придумать Мерой \ Устройте комбинацию для панели самостоятельно, что почти как ScrollViewer, но я не могу думать о какой-либо логики, которые могут отвечают соответствующим требованиям обоих ограничений без явного ведома поведения указанных детей

+0

-1, потому что с вашим ответом так много. Ваш код говорит 'TextBlock', но ваше описание говорит' TextBox'. Кроме того, в классе 'TextBlock' нет свойства' VerticalScrollBarVisibility' ... возможно, вы думали о прикрепленном свойстве 'ScrollViewer.VerticalScrollBarVisibility'? Однако это не работает на «TextBlock». – Sheridan

+0

Мое плохое, это должно было быть TextBox. Должно быть очевидно, что в моем объяснении упоминалось TextBox, а не TextBlock, я сделал ошибку, копируя его код. –

+0

+1 Хорошо, я не сказал, что вы исправили ошибки. – Sheridan

Смежные вопросы