[WPF] ScrollView
От: algama  
Дата: 06.04.09 10:44
Оценка:
приветствую...

возникла задача немного изменить стандартный 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? то всё заработает, но как то не кузяво на мой взгляд.
хотелось бы докопаться до правильного решения.
есть какие соображения? может кто знает как это сделано?
заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.