2013-07-03 1 views
8

Я еще не нашел Информация для этой проблемы для Blend/WPF. Только для Eclipse, и это не поможет.Как прокрутить ScrollViewer во время разработки в Blend

В настоящее время я разрабатываю WPF 4 Application Dialog. Он должен быть ScrollViewer с различными элементами в StackPanel:

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

До сих пор все работает, как ожидалось. Видимая панель прокрутки. Моя проблема в том, что я не могу прокрутить вниз во время разработки в Blend или Visual Studio 2012. Запуск проекта отлично работает, и пользователь может прокручивать вниз до других объектов.

Но во время разработки кажется, что нет возможности прокрутить вниз до позиционирования (теперь скрытых) элементов управления точно.

Одно решение для этого - развернуть элемент управления, чтобы отобразить полный контент. Но это не может быть лучшим решением. У кого-нибудь есть ключ к правильной прокрутке во время разработки?

спасибо.

ответ

12

Не думайте, что для этого существует атрибут времени разработки из коробки. Однако вы можете создать его самостоятельно довольно легко.

сказать что-то вроде:

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

Теперь, установив собственный вложенное свойство в вашем XAML, такие как:

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

Со временем дизайн только вы должны иметь возможность просматривать дизайн с сдвиг прокрутки, такой как

enter image description here

, в то время как в реальном времени управление будет не тронуто. CustomDesignAttributes также имеет аналогичное свойство local:CustomDesignAttributes.HorizontalScrollTo для горизонтального смещения во время разработки.

+0

Спасибо за подробный и рабочий ответ, Вив. Мне удалось заставить его работать. Тем не менее, это путает, почему Microsoft отказалась от поддержки. Приложения Windows Forms с прокручивающимися панелями поддерживают прокрутку в режиме разработки, если я правильно помню. –

+0

Интересно, можно ли сделать то же самое в Silverlight? Я пробовал ваш код в проекте Silverlight, и он бросает «Имя« DependencyPropertyDescriptor »не существует в текущей ошибке». Есть ли обходной путь? Я нашел эту статью https://bkiener.wordpress.com/2010/08/27/listening-to-dependencyproperty-changes-in-silverlight/, которая касается темы, но не может понять, как применить ее для вашего кода. –

2

Существует еще один подход к решению проблемы прокрутки ScrollViewer. В основном сделайте содержимое своего ScrollViewer в UserControl. И тогда вы будете редактировать свое фактическое содержимое, так как вы отредактируете свой UserControl (отдельный файл и полную ширину).

Он описан более подробно в этой статье блога http://electricbeach.org/?p=862

+0

Есть ли детали для Visual Studio? Я застрял на шаге 4 – prouser135

+0

@ prouser135 ну, я не уверен на 100%. Поскольку редактор графического интерфейса в VS немного отличается от того, как в Blend. Но тебе все равно повезет ... –