2013-07-03 7 views
8

Ich habe noch keine Informationen für dieses Problem für Blend/WPF gefunden. Nur für Eclipse und das wird nicht helfen.Wie scrolle ich einen ScrollViewer in Design-Zeit in Blend

Ich entwerfe gerade einen WPF 4 Application Dialog. Es sollte eine ScrollViewer mit verschiedenen Elementen sein innerhalb eines StackPanel:

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Height="470" VerticalAlignment="Top"> 
    <StackPanel Height="1893" Width="899"> 
    <!-- Elements here ... --> 
    </StackPanel> 
<ScrollViewer> 

Bisher funktioniert alles wie erwartet. Die Bildlaufleiste ist sichtbar. Mein Problem ist, dass ich in Entwurfszeit in Blend oder Visual Studio 2012 nicht herunterscrollen kann. Das Ausführen des Projekts funktioniert gut und der Benutzer kann zu anderen Objekten herunterscrollen.

Aber in der Entwurfszeit scheint es keine Möglichkeit zu geben, nach unten zu scrollen, um die (jetzt versteckten) Kontrollen genau zu positionieren.

Eine Lösung dafür ist, das Control zu erweitern, um den vollständigen Inhalt anzuzeigen. Aber das kann nicht die beste Lösung sein. Hat jemand einen Hinweis auf das richtige Scrollen in der Designzeit?

Vielen Dank.

Antwort

12

Glauben Sie nicht, dass dafür ein Out-of-the-Box-Design-Time-Attribut existiert. Sie können jedoch eine selbst ganz einfach erstellen.

etwas sagen wie:

using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 

public static class CustomDesignAttributes { 
    private static bool? _isInDesignMode; 

    public static DependencyProperty VerticalScrollToProperty = DependencyProperty.RegisterAttached(
    "VerticalScrollTo", 
    typeof(double), 
    typeof(CustomDesignAttributes), 
    new PropertyMetadata(ScrollToChanged)); 

    public static DependencyProperty HorizontalScrollToProperty = DependencyProperty.RegisterAttached(
    "HorizontalScrollTo", 
    typeof(double), 
    typeof(CustomDesignAttributes), 
    new PropertyMetadata(ScrollToChanged)); 

    private static bool IsInDesignMode { 
    get { 
     if (!_isInDesignMode.HasValue) { 
     var prop = DesignerProperties.IsInDesignModeProperty; 
     _isInDesignMode = 
      (bool)DependencyPropertyDescriptor.FromProperty(prop, typeof(FrameworkElement)).Metadata.DefaultValue; 
     } 

     return _isInDesignMode.Value; 
    } 
    } 

    public static void SetVerticalScrollTo(UIElement element, double value) { 
    element.SetValue(VerticalScrollToProperty, value); 
    } 

    public static double GetVerticalScrollTo(UIElement element) { 
    return (double)element.GetValue(VerticalScrollToProperty); 
    } 

    public static void SetHorizontalScrollTo(UIElement element, double value) { 
    element.SetValue(HorizontalScrollToProperty, value); 
    } 

    public static double GetHorizontalTo(UIElement element) { 
    return (double)element.GetValue(HorizontalScrollToProperty); 
    } 

    private static void ScrollToChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    if (!IsInDesignMode) 
     return; 
    ScrollViewer viewer = d as ScrollViewer; 
    if (viewer == null) 
     return; 
    if (e.Property == VerticalScrollToProperty) { 
     viewer.ScrollToVerticalOffset((double)e.NewValue); 
    } else if (e.Property == HorizontalScrollToProperty) { 
     viewer.ScrollToHorizontalOffset((double)e.NewValue); 
    } 
    } 
} 

nun durch die benutzerdefinierte angefügte Eigenschaft in XAML Einstellung wie:

<ScrollViewer Height="200" 
       local:CustomDesignAttributes.VerticalScrollTo="50"> 
... 

In Entwurfszeit allein sollten Sie in der Lage sein, Ihr Design zu sehen mit ein Scroll-Offset wie

enter image description here

während der tatsächlichen Laufzeit wird die Steuerung nicht berührt. Die CustomDesignAttributes hat auch eine ähnliche Eigenschaft local:CustomDesignAttributes.HorizontalScrollTo für horizontalen Offset zur Entwurfszeit.

+0

Sie für Ihre ausführliche und Arbeits Antwort danken, Viv. Ich habe es geschafft, es zum Laufen zu bringen. Dennoch ist es verwirrend, warum Microsoft die Unterstützung fallen gelassen hat. Windows Forms Anwendungen mit Bildlaufleisten unterstützt das Scrollen im Entwurfsmodus, wenn ich mich richtig erinnere. –

+0

Ich frage mich, ob es möglich ist, dasselbe in Silverlight zu tun? Ich habe versucht, Ihren Code in Silverlight-Projekt und es wirft 'Der Name DependencyPropertyDescriptor 'ist nicht im aktuellen Kontext Fehler vorhanden. Gibt es eine Problemumgehung? Ich fand diesen Artikel https://bkiener.wordpress.com/2010/08/27/listening-to-dependencyproperty-changes-in-silverlight/, der das Thema berührt, aber nicht herausfinden kann, wie es für Ihren Code angewendet wird. –

2

Es gibt einen anderen Ansatz, um das Problem des ScrollViewers ohne Scrollen zu lösen. Grundsätzlich sollte der Inhalt von ScrollViewer in ein UserControl umgewandelt werden. Und dann werden Sie Ihre tatsächlichen Inhalte bearbeiten, wie Sie Ihr UserControl (separate Datei und volle Breite) bearbeiten würden.

Es wird in mehr Details zu diesem Blog-Artikel beschrieben http://electricbeach.org/?p=862

+0

Gibt es Details zu Visual Studio? Ich stecke bei Schritt 4 – prouser135

+0

@ prouser135 gut, ich bin nicht 100% sicher. Als GUI-Editor in VS ist ein bisschen anders als in Blend. Aber Sie können immer noch Glück haben ... –

Verwandte Themen