ScrollViewer控件模板打破了文本框

时间:2012-11-30 14:54:24

标签: c# .net wpf xaml controltemplate

我从MSDN(link)复制了ScrollViewer模板,它打破了文本框行为。当我使用鼠标选择文本时,滚动现在不遵循选择。为什么?如何解决?

这是我的代码

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525">
  <Window.Resources>
    <Style TargetType="{x:Type ScrollViewer}">
      <Setter Property="OverridesDefaultStyle"
              Value="True" />
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ScrollViewer}">
            <Grid>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
              </Grid.ColumnDefinitions>
              <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition Height="Auto" />
              </Grid.RowDefinitions>
              <Border Grid.Column="1"
                      BorderThickness="0,1,1,1">
                <Border.BorderBrush>
                  <SolidColorBrush Color="{DynamicResource BorderMediumColor}" />
                </Border.BorderBrush>
                <ScrollContentPresenter />
              </Border>
              <ScrollBar x:Name="PART_VerticalScrollBar"
                         Value="{TemplateBinding VerticalOffset}"
                         Maximum="{TemplateBinding ScrollableHeight}"
                         ViewportSize="{TemplateBinding ViewportHeight}"
                         Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" />
              <ScrollBar x:Name="PART_HorizontalScrollBar"
                         Orientation="Horizontal"
                         Grid.Row="1"
                         Grid.Column="1"
                         Value="{TemplateBinding HorizontalOffset}"
                         Maximum="{TemplateBinding ScrollableWidth}"
                         ViewportSize="{TemplateBinding ViewportWidth}"
                         Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" />
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Window.Resources>
  <StackPanel>
    <TextBox Margin="20"
             Width="100"
             Text="sdjkfhsdjkfhjkdshxcmvnm,xcnv,mxcnv, mxcnv,mxcngjklsdjkfh jkdfghjkfhgjkdfhgkjdfghkjdfhgbkjcvhbkcvjbh" />
  </StackPanel>
</Window>

我使用.NET 4

3 个答案:

答案 0 :(得分:2)

我有同样的问题,我最终通过向ScrollContentPresenter添加CanContenScroll =“True”来解决。

<ScrollContentPresenter Grid.Column="0" CanContentScroll="True"/>

如果你想让它更灵活,只需将它绑定到祖先值:

 <ScrollContentPresenter Grid.Column="0" 
                         CanContentScroll="{TemplateBinding CanContentScroll}" />

希望有所帮助

答案 1 :(得分:0)

是的,我得到了同样的行为。我担心我无法弄清楚它为什么会发生,它可能是WPF中的一个错误,也可能是他们定义控制模板的方式。

TextBox的控件模板有一个滚动查看器作为其布局的一部分,显然模板以某种方式干扰了它。

我可以做的唯一建议是你给你的样式一个x:Key值,并且只在你需要它的特定情况下在ScrollViewer元素上引用该样式,而不是将它应用于所有ScrollViewers。然后,TextBox的元素树中包含的ScrollViewer将不会拾取它。有点痛苦,你失去了WPF模板的动态性,但它应该有用。

答案 2 :(得分:0)

您的样式正在定位ScrollViewer中类型为Window ALL 控件,因为该样式没有设置键(x:Key)-这是一个由于TextBox实际上在其模板中使用了ScrollViewer

尝试使用<Style x:Key="MyScrollViewerStyle" TargetType="{x:Type ScrollViewer}">。然后,您可以像这样在ScrollViewer上引用此样式:<ScrollViewer Style="{StaticResource MyScrollViewerStyle}">