2013-07-03 22 views
8

Nie znalazłem jeszcze informacji dla tego problemu dla Blend/WPF. Tylko dla Eclipse i to nie pomoże.Jak przewinąć ScrollViewer w czasie projektowania w mieszance

Obecnie projektuję okno aplikacji WPF 4. Powinien on być ScrollViewer z różnych elementów w StackPanel:

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

Jak dotąd wszystko działa zgodnie z oczekiwaniami. Pasek przewijania jest widoczny. Mój problem polega na tym, że nie mogę przewinąć w dół w czasie projektowania w Blend lub Visual Studio 2012. Uruchamianie projektu działa poprawnie, a użytkownik może przewijać w dół do innych obiektów.

Ale w Czasie Projektowania nie ma szans na przewinięcie w dół do dokładnego pozycjonowania (teraz ukrytych) Kontrolek.

Jednym z rozwiązań jest rozszerzenie Kontrolki, aby wyświetlić pełną zawartość. Ale to nie może być najlepsze rozwiązanie. Czy ktoś ma wskazówkę co do właściwego przewijania w czasie projektowania?

Dziękuję bardzo.

Odpowiedz

12

Nie sądzę, aby w tym czasie istniał niestandardowy atrybut czasu projektowania. Jednak możesz go stworzyć całkiem łatwo.

powiedzieć coś w stylu:

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

Teraz ustawiając załączony właściwość niestandardową w XAML, takie jak:

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

W czasie projektowania sam powinieneś móc zobaczyć swój projekt z przesunięcie przewijania, takie jak

enter image description here

podczas rzeczywistego czasu działania, sterowanie zostanie unieruchomione. Identyfikator CustomDesignAttributes ma również podobną właściwość local:CustomDesignAttributes.HorizontalScrollTo dla przesunięcia poziomego w czasie projektowania.

+0

dziękuję za szczegółową odpowiedź i pracy, Viv. Udało mi się sprawić, żeby działało. Niemniej jednak, jest to mylące, dlaczego Microsoft zrzekł się wsparcia. Aplikacje Windows Forms z przewijanymi panelami obsługują przewijanie w trybie projektowania, o ile dobrze pamiętam. –

+0

Zastanawiam się, czy można zrobić to samo w Silverlight? Próbowałem twój kod w projekcie Silverlight i rzuca "Nazwa" DependencyPropertyDescriptor "nie istnieje w bieżącym kontekście" błąd. Czy istnieje jakieś obejście? Znalazłem ten artykuł https://bkiener.wordpress.com/2010/08/27/listening-to-dependencyproperty-sanges-in-silverlight/ który dotyka tematu, ale nie mogę dowiedzieć się, jak zastosować go do kodu. –

2

Istnieje inne podejście do rozwiązania problemu nie przewijającego się ScrollViewera. Zasadniczo uczyń zawartość swojego ScrollViewer narzędziem UserControl. Następnie edytujesz swoją aktualną zawartość, tak jak edytowałbyś swój UserControl (osobny plik i całą szerokość).

To jest opisany bardziej szczegółowo w tym artykuł napisany http://electricbeach.org/?p=862

+0

Czy są jakieś szczegóły dotyczące Visual Studio? Utknąłem w kroku 4 – prouser135

+0

@ prouser135 cóż, nie jestem w 100% pewny. Ponieważ edytor GUI w VS jest nieco inny niż w Blend. Ale wciąż możesz mieć szczęście ... –