J'ai fait quelque chose de similaire et la meilleure façon de le faire était de mettre votre contenu dans une visionneuse de défilement et d'éteindre les barres de défilement. Ensuite, codez vos boutons pour faire défiler le scrollviewer.
Editer: Répondre au commentaire sur aucune façon de gérer le dimensionnement.
Tout d'abord, vous devez générer ce contrôle en tant que ContentControl. Il devrait avoir un modèle défini dans generic.xaml qui a vos contrôles de bouton plus la visionneuse de défilement. Quelque chose comme:
<Canvas x:Name="root">
<Button x:Name="left" Content="<"/>
<Button x:Name="right" Content=">"/>
<ScrollViewer x:Name="viewer" BorderThickness="0" VerticalScrollBarVisibility="Hidden">
<ContentPresenter />
</ScrollViewer>
</Canvas>
Ensuite, dans votre contrôle, vous devrez passer outre OnApplyTemplate:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
left = GetTemplateChild("left") as Button;
left.Click += new RoutedEvent(YourHandler);
right = GetTemplateChild("right") as Button;
right.Click += new RoutedEvent(YourHandler);
// position your scroll buttons here, not writing that code
scroll = GetTemplateChild("viewer") as ScrollViewer;
root = GetTemplateChild("root") as Canvas;
var fe = this.Content as FrameworkElement;
if (fe != null)
{
fe.SizeChanged += new SizeChangedEventHandler(fe_SizeChanged);
}
}
void fe_SizeChanged(object sender, SizeChangedEventArgs e)
{
this.InvalidateMeasure();
}
protected override Size ArrangeOverride(Size finalSize)
{
if (!double.IsInfinity(scroll.ViewportHeight))
{
left.Visibility = (scroll.HorizontalOffset > 0);
right.Visibility = (scroll.HorizontalOffset < ScrollableHeight);
}
return base.ArrangeOverride(finalSize);
}
protected override Size MeasureOverride(Size availableSize)
{
scroll.Measure(availableSize);
return scroll.DesiredSize;
}
Dans votre bouton gestionnaires de clic vous devez (1), faites défiler le spectateur et (2) vérifier la nouvelle valeur de l'objet HorizontalOffset pour voir si vous devez masquer ou afficher l'un des boutons.
Avertissement: Ce code ne fonctionne probablement pas tel quel puisqu'il a été écrit à la main et basé sur un exemple différent.
Le problème avec cette méthode est que je ne vois pas un événement que je puisse joindre à, qui me notifierait lorsque la fenêtre a été modifiée de telle sorte que les boutons doivent être rendus visibles. Donc en effet, je devrais rendre les boutons toujours visibles, ce que je n'aime pas. – Nick