Почему не прокручивается мой ScrollViewer? - PullRequest
0 голосов
/ 08 февраля 2011

Мой ScrollViewer не работает.Я создал UserControl, чтобы показать стрелки, которые сообщают пользователю, что просмотрщик прокрутки может быть прокручен.Так что теперь содержимое просто переполняет ScrollViewer.Вот мой XAML:

<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 Ответ

1 голос
/ 08 февраля 2011

Я не уверен на 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>

Обновление

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

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

Вот пример использования события Loaded

<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;
}
...