2011-02-08 6 views
0

My ScrollViewer не работает. Я создал UserControl, чтобы показать индикаторы стрелки, которые говорят пользователю, что прокрутка просмотра прокручивается. Итак, теперь содержимое просто переполняет ScrollViewer. Вот моя XAML:Почему не прокручивается прокрутка ScrollViewer?

<UserControl x:Class="QCK.Common.ResourceLibrary.CustomControls.ArrowScrollViewer" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      Name="UserControl"> 
    <UserControl.Resources> 

     <Style x:Key="ScrollDownArror" TargetType="{x:Type Border}"> 
      <Setter Property="Margin" Value="2,0,18,0"/> 
      <Setter Property="Visibility" Value="Visible"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=CanScrollDown}" Value="True"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 

     <Style x:Key="ScrollUpArror" TargetType="{x:Type Border}"> 
      <Setter Property="Margin" Value="2,0,18,0"/> 
      <Setter Property="Visibility" Value="Visible"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=CanScrollUp}" Value="True"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 

    </UserControl.Resources> 
    <Grid> 
     <ScrollViewer Name="scrollViewer" VerticalScrollBarVisibility="Visible"> 
      <ContentPresenter VerticalAlignment="Top"/> 
     </ScrollViewer> 

     <Border Style="{StaticResource ScrollUpArror}" DataContext="{Binding ElementName=c_list}" 
           IsHitTestVisible="false" 
           VerticalAlignment="Top"> 
      <Image Margin="15" Height="20"> 
       <Image.Source> 
        <DrawingImage> 
         <DrawingImage.Drawing> 
          <GeometryDrawing Brush="DarkGray" Geometry="M 0, 10 L 50, 30 L 100, 10 Z"> 
           <GeometryDrawing.Pen> 
            <Pen Brush="DimGray" /> 
           </GeometryDrawing.Pen> 
          </GeometryDrawing> 
         </DrawingImage.Drawing> 
        </DrawingImage> 
       </Image.Source> 
      </Image> 
     </Border> 

     <Border Style="{StaticResource ScrollDownArror}" DataContext="{Binding ElementName=c_list}" 
           IsHitTestVisible="false" 
           VerticalAlignment="Bottom"> 
      <Image Margin="15" Height="20"> 
       <Image.Source> 
        <DrawingImage> 
         <DrawingImage.Drawing> 
          <GeometryDrawing Brush="DarkGray" Geometry="M 0, 30 L 50, 10 L 100, 30 Z"> 
           <GeometryDrawing.Pen> 
            <Pen Brush="DimGray" /> 
           </GeometryDrawing.Pen> 
          </GeometryDrawing> 
         </DrawingImage.Drawing> 
        </DrawingImage> 
       </Image.Source> 
      </Image> 
     </Border> 
    </Grid> 
</UserControl> 

Содержимое просто переполнение внутри управления не показывает полосу прокрутки или колесо мыши позволяет прокрутку или что-нибудь.

ответ

1

Я не уверен на 100%, как вы хотите, чтобы этот UserControl работал, поэтому я мог бы быть здесь целиком. Как я понимаю, вы хотите быть в состоянии сделать что-то вроде этого

<local:ArrowScrollViewer x:Name="userControl11"> 
    <TextBox Text="Test" AcceptsReturn="True"/> 
</local:ArrowScrollViewer> 

И TextBox закончится между стрелочными индикаторами. В этом случае, я думаю, вам нужно будет отредактировать шаблон UserControl. Попробуйте как этот

<UserControl.Resources> 
    <Style x:Key="ScrollDownArror" TargetType="{x:Type Border}"> 
     <Setter Property="Margin" Value="2,0,18,0"/> 
     <Setter Property="Visibility" Value="Visible"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=CanScrollDown}" Value="True"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

    <Style x:Key="ScrollUpArror" TargetType="{x:Type Border}"> 
     <Setter Property="Margin" Value="2,0,18,0"/> 
     <Setter Property="Visibility" Value="Visible"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=CanScrollUp}" Value="True"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 
<UserControl.Template> 
    <ControlTemplate TargetType="{x:Type UserControl}"> 
     <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="*"/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 
       <Border Grid.Row="0" Style="{StaticResource ScrollUpArror}" DataContext="{Binding ElementName=c_list}" 
            IsHitTestVisible="false" 
            VerticalAlignment="Top"> 
        <Image Margin="15" Height="20"> 
         <Image.Source> 
          <DrawingImage> 
           <DrawingImage.Drawing> 
            <GeometryDrawing Brush="DarkGray" Geometry="M 0, 10 L 50, 30 L 100, 10 Z"> 
             <GeometryDrawing.Pen> 
              <Pen Brush="DimGray" /> 
             </GeometryDrawing.Pen> 
            </GeometryDrawing> 
           </DrawingImage.Drawing> 
          </DrawingImage> 
         </Image.Source> 
        </Image> 
       </Border> 
       <ScrollViewer Grid.Row="1" Name="scrollViewer" VerticalScrollBarVisibility="Visible"> 
        <ContentPresenter Grid.Row="1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </ScrollViewer> 
       <Border Grid.Row="2" Style="{StaticResource ScrollDownArror}" DataContext="{Binding ElementName=c_list}" 
            IsHitTestVisible="false" 
            VerticalAlignment="Bottom"> 
        <Image Margin="15" Height="20"> 
         <Image.Source> 
          <DrawingImage> 
           <DrawingImage.Drawing> 
            <GeometryDrawing Brush="DarkGray" Geometry="M 0, 30 L 50, 10 L 100, 30 Z"> 
             <GeometryDrawing.Pen> 
              <Pen Brush="DimGray" /> 
             </GeometryDrawing.Pen> 
            </GeometryDrawing> 
           </DrawingImage.Drawing> 
          </DrawingImage> 
         </Image.Source> 
        </Image> 
       </Border> 
      </Grid>     
     </Border> 
    </ControlTemplate> 
</UserControl.Template> 

Update

Есть несколько способов, которые вы можете получить доступ к ScrollViewer в шаблоне из кода позади. Вот три способа, что приходит на ум

  • Добавьте обработчик событий для Loaded случае ScrollViewer
  • Использования Template.FindName в коде
  • траверс дерева визуалов

Вот пример с использованием события с нагрузкой

<ScrollViewer Loaded="scrollViewer_Loaded" 
       Grid.Row="1" 
       ...> 

Код позади

private ScrollViewer m_scrollViewer; 
private void scrollViewer_Loaded(object sender, RoutedEventArgs e) 
{ 
    m_scrollViewer = sender as ScrollViewer; 
} 

И если вы хотите использовать FindName

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    m_scrollViewer = this.Template.FindName("scrollViewer", this) as ScrollViewer; 
} 
+0

Но если я, что я не могу получить доступ к зрителю прокрутки в коде позади? Могу я? – Jordan

+0

@Jordan: Обновлен мой ответ о том, как получить доступ к 'ScrollViewer' в коде позади –

Смежные вопросы