2013-07-03 19 views
8

Non ho ancora trovato Informazioni per questo problema su Blend/WPF. Solo per Eclipse e questo non aiuta.Come faccio a scorrere un ScrollViewer in Design Time in Blend

Attualmente sto progettando una finestra di dialogo dell'applicazione WPF 4. Dovrebbe essere un ScrollViewer con elementi diversi all'interno di un StackPanel:

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

Finora tutto funziona come previsto. La barra di scorrimento è visibile. Il mio problema è che non riesco a scorrere verso il basso in fase di progettazione all'interno di Blend o Visual Studio 2012. L'esecuzione del progetto funziona correttamente e l'utente può scorrere verso il basso fino ad altri oggetti.

Ma in Design Time non sembra esserci alcuna possibilità di scorrere verso il basso per posizionare i controlli (ora nascosti) in modo accurato.

Una soluzione è espandere il controllo per mostrare il contenuto completo. Ma quella non può essere la migliore soluzione. Qualcuno ha un indizio per lo scorrimento corretto in fase di progettazione?

Grazie mille.

risposta

12

Non pensare che esista un attributo in tempo reale di progettazione per questo. Tuttavia puoi crearne uno tu stesso abbastanza facilmente.

dire qualcosa come:

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); 
    } 
    } 
} 

Ora impostando la proprietà associata personalizzato nel XAML come ad esempio:

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

In fase di progettazione solo si dovrebbe essere in grado di visualizzare il vostro disegno con un offset di scorrimento come

enter image description here

mentre nel tempo di esecuzione effettivo il controllo non verrà toccato. Lo CustomDesignAttributes ha anche una proprietà simile local:CustomDesignAttributes.HorizontalScrollTo per l'offset orizzontale in fase di progettazione.

+0

Grazie per la vostra risposta dettagliata e di lavoro, Viv. Sono riuscito a farlo funzionare. Tuttavia, è fuorviante il motivo per cui Microsoft ha abbandonato il supporto. Le applicazioni Windows Form con pannelli a scorrimento supportano lo scorrimento in modalità progettazione se non ricordo male. –

+0

Mi chiedo se è possibile fare la stessa cosa in Silverlight? Ho provato il tuo codice nel progetto Silverlight e getta 'Il nome 'DependencyPropertyDescriptor' non esiste nell'errore di contesto corrente'. C'è qualche soluzione? Ho trovato questo articolo https://bkiener.wordpress.com/2010/08/27/listening-to-dependencyproperty-changes-in-silverlight/ che tocca l'argomento, ma non riesco a capire come applicarlo per il tuo codice. –

2

C'è un altro approccio per risolvere il problema di ScrollViewer senza scorrimento. In pratica, crea i contenuti del tuo ScrollViewer in un UserControl. E poi modificherete i vostri contenuti reali come modifichereste il vostro UserControl (file separato e larghezza completa).

E 'descritto più in dettaglio in questo articolo del blog http://electricbeach.org/?p=862

+0

Esiste un dettaglio per Visual Studio? Sono bloccato al punto 4 – prouser135

+0

@ prouser135 beh, non sono sicuro al 100%. Come editor GUI in VS è un po 'diverso rispetto a Blend. Ma potresti essere ancora fortunato ... –