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