如何在Blend中的设计时滚动ScrollViewer

时间:2013-07-03 07:28:06

标签: wpf xaml scrollviewer blend

我还没有找到有关Blend / WPF此问题的信息。仅适用于Eclipse,这无济于事。

我目前正在设计一个WPF 4应用程序对话框。它应该是ScrollViewer中具有不同元素的StackPanel

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

到目前为止,一切都按预期进行。滚动条可见。我的问题是我无法在Blend或Visual Studio 2012中向下滚动设计时。运行项目工作正常,用户可以向下滚动到其他对象。

但是在设计时,似乎没有机会向下滚动以准确定位(现在隐藏)控件。

一个解决方案是扩展控件以显示完整的内容。但这不是最好的解决方案。有没有人有设计时正确滚动的线索?

非常感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

还有另一种解决非滚动ScrollViewer问题的方法。基本上将ScrollViewer的内容变为UserControl。然后,您将编辑实际内容,就像编辑UserControl一样(单独的文件和全宽)。

此博客文章http://electricbeach.org/?p=862

中有更详细的描述