Я разобрался с ответом на второй вопрос. Мне нужен был ItemsControl, который поддерживал прокрутку, и мне нужно было иметь элементы в Grid, а не в StackPanel по умолчанию. Чтобы выполнить оба требования, я использовал ControlTemplate:
<!--In the resources...-->
<ControlTemplate x:Key="GraphTemplate" TargetType="ItemsControl">
<ScrollViewer Name="ScrollViewer"
Padding="{TemplateBinding Padding}"
HorizontalScrollBarVisibility="Auto">
...
<Grid Name="Panel" IsItemsHost="True"
Background="{TemplateBinding ItemsControl.Background}"/>
...
</ScrollViewer>
</ControlTemplate>
<!--Later...-->
<ItemsControl x:Name="_itemsControl"
ItemsSource="{Binding Items}"
Template="{StaticResource GraphTemplate}"
Background="LightYellow"/>
Чтобы получить события мыши со значимыми координатами мыши (то есть координатами в прокручиваемом пространстве), необходимо было получить ссылку на сетку, используя странное заклинание:
Grid grid = (Grid)_itemsControl.Template.FindName("Panel", _itemsControl);
Затем вы присоединяете обработчики событий к сетке, а внутри обработчиков событий мыши получаете координаты мыши w.r.t. сетка с использованием
Point p = e.GetPosition((IInputElement)sender);
Чтобы получить события мыши на всей поверхности, элемент управления (фактически сетка) должен иметь фон, поэтому я установил выше Background = "LightYellow", который распространяется на сетку через привязку в ControlTemplate.