Ich habe etwas ähnliches getan, und das Beste, was ich gefunden habe, war, den Inhalt in einen Scroll-Viewer zu bringen und einfach die Bildlaufleisten auszuschalten. Codiere dann deine Knöpfe, um den Scrollviewer zu scrollen.
Bearbeiten: Reagieren auf Kommentar über keine Möglichkeit, mit Sizing umzugehen.
Zunächst einmal würden Sie dieses Steuerelement als ContentControl erstellen. Es sollte eine Vorlage enthalten, die in generic.xaml definiert ist und die Schaltflächensteuerelemente und den Bildlauf-Viewer enthält. Etwas wie:
<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>
Dann in Ihrer Kontrolle würden Sie OnApplyTemplate außer Kraft setzen müssen:
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;
}
In Ihrer Schaltfläche klicken Handler Sie würden müssen (1) bewegen den Betrachter und (2) überprüfen Sie die neuen Wert des HorizontalOffset, um zu sehen, ob Sie eine der Schaltflächen ausblenden oder anzeigen müssen.
Haftungsausschluss: Dieser Code funktioniert wahrscheinlich nicht so, wie es ist, da es von Hand geschrieben wurde und auf einem anderen Beispiel basiert.
Das Problem bei dieser Methode ist, dass ich nicht ein Ereignis sehe ich anbringen könnte an, die mich benachrichtigen würde, wenn sich das Ansichtsfenster so geändert hat, dass die Schaltflächen sichtbar gemacht werden müssen. Also müsste ich die Buttons immer sichtbar machen, was ich nicht mag. – Nick