3

我从 MSDN(链接)复制了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

4

3 回答 3

3

我有同样的问题,我终于通过将 CanContenScroll="True" 添加到 ScrollContentPresenter 来解决。

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

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

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

希望能帮助到你

于 2013-04-17T14:50:28.583 回答
0

是的,我得到了同样的行为。恐怕我无法真正弄清楚为什么会发生这种情况,这可能是 WPF 中的错误或他们定义控件模板的方式。

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

我能提出的唯一建议是您为您的样式设置一个 x:Key 值,并且仅在您需要的特定情况下在 ScrollViewer 元素上引用该样式,而不是将其应用于所有 ScrollViewer。然后,TextBox 的元素树中包含的 ScrollViewer 将无法识别它。有点痛苦,你失去了 WPF 模板的动态特性,但它应该可以工作。

于 2012-11-30T15:30:45.033 回答
0

您的样式针对的是所有ScrollViewer类型的控件,Window因为该样式没有x:Key设置键 () - 这是一个问题,因为TextBox实际上ScrollViewer在其模板中使用了 a。

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

于 2019-05-28T15:29:37.770 回答