приветствую...
возникла задача немного изменить стандартный ScrollView.
а именно поиметь в нём не один а два ScrollContentPresenter.
при этом поведение первого должно соответствовать оригиналу(скролиться по обеим осям), а второй только по горизонтали.
набросал такой шаблон
<Style TargetType="{x:Type local:ScrollViewerEX}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ScrollViewerEX}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ScrollContentPresenter
Name="PART_ScrollContentPresenter"
Grid.Column="1"
Grid.Row="0"
Content="{TemplateBinding Content}"
/>
<ScrollContentPresenter
Name="PART_EXScrollContentPresenter"
Grid.Column="1"
Grid.Row="1"
CanContentScroll="True"
CanHorizontallyScroll="True"
>
<ScrollContentPresenter.Content>
<Border
BorderThickness="2"
BorderBrush="Magenta"
Width="{TemplateBinding ExtentWidth }"
Height="43"
>
<Canvas Background="Coral" >
<Canvas Background="Brown" >
<Ellipse Name="ellipse10" Canvas.Left="10" Canvas.Top="10" Height="20" Width="20" Stroke="Black" Fill="Red" />
<Ellipse Name="ellipse20" Canvas.Left="120" Canvas.Top="10" Height="20" Width="20" Stroke="Black" Fill="Green" />
<Ellipse Name="ellipse30" Canvas.Left="250" Canvas.Top="10" Height="20" Width="20" Stroke="Black" Fill="Blue" />
</Canvas>
</Canvas>
</Border>
</ScrollContentPresenter.Content>
</ScrollContentPresenter>
<ScrollBar
Name="PART_VerticalScrollBar"
Grid.Row="0"
Grid.Column="2"
Grid.RowSpan="2"
Value="{TemplateBinding VerticalOffset}"
Maximum="{TemplateBinding ScrollableHeight}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
/>
<ScrollBar
Name="PART_HorizontalScrollBar"
Orientation="Horizontal"
Grid.Row="2"
Grid.Column="1"
Value="{TemplateBinding HorizontalOffset}"
Maximum="{TemplateBinding ScrollableWidth}"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
/>
<Rectangle
Grid.Row="2"
Grid.Column="2"
Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
переопределил ScrollViewer
[TemplatePart(Name = "PART_EXScrollContentPresenter", Type = typeof(ScrollContentPresenter))]
public class ScrollViewerEX : ScrollViewer
{
//private ScrollContentPresenter timeLineContentPresenter = null;
private ScrollContentPresenter timeScaleContentPresenter = null;
static ScrollViewerEX()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ScrollViewerEX), new FrameworkPropertyMetadata(typeof(ScrollViewerEX)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
//this.timeLineContentPresenter = base.GetTemplateChild("PART_ScrollContentPresenter") as ScrollContentPresenter;
this.timeScaleContentPresenter = base.GetTemplateChild("PART_EXScrollContentPresenter") as ScrollContentPresenter;
}
/*
protected override void OnScrollChanged(ScrollChangedEventArgs e)
{
base.OnScrollChanged(e);
if (e.HorizontalChange != 0)
{
if (this.timeScaleContentPresenter != null)
{
this.timeScaleContentPresenter.SetHorizontalOffset(e.HorizontalOffset);
}
}
}
*/
}
верхний ScrollContentPresenter работает как положено,а нижний не скролиться.
если раскоментировать
OnScrollChanged? то всё заработает, но как то не кузяво на мой взгляд.
хотелось бы докопаться до правильного решения.
есть какие соображения? может кто знает как это сделано?
заранее спасибо.