3

ScrollViewerMSDN (リンク) からテンプレートをコピーしましたが、テキスト ボックスの動作が壊れます。マウスを使用してテキストを選択すると、スクロールが選択に追従しなくなりました。なんで?修正方法は?

これが私のコードです

<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 に答える