TextBlock模板中的ScrollViewer路由滚动?

时间:2012-02-17 10:32:30

标签: wpf scrollviewer textblock

我有一个ScrollViewer(name =“master”),在StackPanel里面有一些示例边框或矩形,还有一个TextBox,它的Text比显示的多,所以TextBox是可滚动的。当您滚动TextBox并到达顶部或底部边框时,TextBox模板中的ScrollViewer(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 :(得分:0)

我的建议是捕获文本框本身的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;
    }
}

不需要以这种方式应用新模板,干杯!