ScrollViewer в TextBlock Шаблон маршрутизации прокрутки? - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть ScrollViewer (name = "master") внутри StackPanel с некоторыми примерами границ или прямоугольников, а также TextBox, который имеет больше текста, чем отображается, поэтому TextBox можно прокручивать.Когда вы прокручиваете TextBox и достигаете верхней нижней границы, ScrollViewer, который находится в шаблоне TextBox (ScrollViewer x: Name = "PART_ContentHost"), направляет прокрутку к основному ScrollViewer снаружи ("master").

можно ли отредактировать шаблон TextBox для облегчения этого поведения?

Один из способов - это сочетание с другим ScrollViewer в шаблоне, это работает нормально, но увидеть его больше невозможновыбор, так что это не решение.

У вас есть другие идеи?

<Style x:Key="TextBoxStyle1" TargetType="{x:Type TextBox}">
        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                        <ScrollViewer x:Name="PART_ContentHost" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


<ScrollViewer Name="master" Height="71" Width="164" HorizontalAlignment="Right" Margin="0,0,38.666,28.833" VerticalAlignment="Bottom">
                    <StackPanel Orientation="Vertical" Width="121">
                        <Rectangle Fill="red" Height="45" Stroke="Black"/>
                        <Rectangle Fill="red" Height="45" Stroke="Black"/>
                        <Rectangle Fill="red" Height="45" Stroke="Black"/>
                        <Rectangle Fill="red" Height="45" Stroke="Black"/>
                        <TextBox Text="TextBox sydxr gs dgh drz h we rths dretghe dtrzuj hwesrtgh
     bdnftzh srdztj ser tghbed5rsetzhnrd hserdfgcjmnjs egrfhfn dshgrdxthgj" TextWrapping="Wrap" Height="67" Style="{StaticResource detail_text}" />
                        <Rectangle Fill="red" Height="45" Stroke="Black"/>
                        <Rectangle Fill="red" Height="45" Stroke="Black"/>
                    </StackPanel>
            </ScrollViewer>

Большое спасибо.

1 Ответ

0 голосов
/ 17 февраля 2012

Я предлагаю записать PreviewMouseWheelEvent в самом текстовом поле:

<TextBox Text="TextBox sydxr gs dgh drz h we rths dretghe dtrzuj hwesrtgh
 bdnftzh srdztj ser tghbed5rsetzhnrd hserdfgcjmnjs egrfhfn dshgrdxthgj" TextWrapping="Wrap" Height="67" ScrollViewer.VerticalScrollBarVisibility="Auto" PreviewMouseWheel="TextBox_PreviewMouseWheel" />

Обратите внимание, что я также включил ScrollViewer.VerticalScrollBarVisibility="Auto".

Затем оцените, выполняется ли прокрутка, когда либо насверху или снизу и пометьте событие как обработанное, если это так:

private void TextBox_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    var textbox = sender as TextBox;
    var decorator = VisualTreeHelper.GetChild(textbox, 0) as Decorator;
    var scrollViewer = decorator.Child as ScrollViewer;

    if ((scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight && e.Delta < 0) ||
        (scrollViewer.VerticalOffset == 0 && e.Delta > 0))
    {
        e.Handled = true;
    }
}

Нет необходимости применять новые шаблоны таким образом, ура!

...