スクロールビューアが長いので、重要な場所をスクロールバーの小さな画像でマークしたいと思います。画像をクリックすると、スクロールバーが対応するコンテンツにジャンプします。
この機能は、EclipseやChromeなどのいくつかのアプリケーションで見たことがあり、WPFでどのように再現するのか疑問に思っていました。
スクロールビューアが長いので、重要な場所をスクロールバーの小さな画像でマークしたいと思います。画像をクリックすると、スクロールバーが対応するコンテンツにジャンプします。
この機能は、EclipseやChromeなどのいくつかのアプリケーションで見たことがあり、WPFでどのように再現するのか疑問に思っていました。
簡単な答えは「ScrollBarのテンプレートを変更する」です。
長い答えは...ScrollBarコントロールのテンプレートにItemsControlを追加するということです。このItemsControlをテンプレートの上に置き、IsHitTestVisibleをfalseに設定して、マウスイベントをキャプチャしないようにします。
次に、スポットを適切に配置できるようにするために、ItemsPanelTemplateとしてCanvasを使用します。各要素を画像でレンダリングするために、ItemsControlのItemsSourceプロパティとDataTemplateでデータバインディングを使用します。
これが私がBlendを使って行ったサンプルです。もちろん、それは完全ではありません(たとえば、マウスイベントを処理しません)が、それがあなたの出発点になることを願っています。
(ソース:japf.fr)
<ControlTemplate TargetType="{x:Type ScrollBar}">
<Grid SnapsToDevicePixels="true" Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}}"/>
<ColumnDefinition Width="0.00001*"/>
<ColumnDefinition MaxWidth="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}}"/>
</Grid.ColumnDefinitions>
<RepeatButton Style="{StaticResource ScrollBarButton}" Command="{x:Static ScrollBar.LineLeftCommand}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="LeftArrow"/>
<Track x:Name="PART_Track" Grid.Column="1" d:IsHidden="True">
<Track.Thumb>
<Thumb Style="{StaticResource ScrollBarThumb}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="HorizontalGripper"/>
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton Style="{StaticResource HorizontalScrollBarPageButton}" Command="{x:Static ScrollBar.PageRightCommand}"/>
</Track.IncreaseRepeatButton>
<Track.DecreaseRepeatButton>
<RepeatButton Style="{StaticResource HorizontalScrollBarPageButton}" Command="{x:Static ScrollBar.PageLeftCommand}"/>
</Track.DecreaseRepeatButton>
</Track>
<ItemsControl Grid.Column="1" HorizontalAlignment="Stretch">
<sys:Double>10</sys:Double>
<sys:Double>50</sys:Double>
<sys:Double>100</sys:Double>
<sys:Double>140</sys:Double>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Fill="Orange" Width="3" Height="16"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding }" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<RepeatButton Style="{StaticResource ScrollBarButton}" Grid.Column="2" Command="{x:Static ScrollBar.LineRightCommand}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="RightArrow" d:IsHidden="True"/>
</Grid>
</ControlTemplate>
japfsの回答に貢献するには:サイズ変更の問題に関する更新を解決しました:japfs Styleを使用して、ItemsSourceをItemControlに適用できます。
ItemsSource="{Binding Positions, UpdateSourceTrigger=PropertyChanged}"
PositionsのタイプがObservableCollectionであり、SizeChanged-eventで位置が再計算されていることを確認してください。さらに、そのイベント呼び出し(ViewModelが実装する必要があるINotifyPropertyChangedインターフェイス)
OnPropertyChanged("Positions");
最初にリストで試してみましたが、正しく更新されませんでした。ObservableCollectionで問題なく動作しました。