8

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

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

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

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

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

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

非常感谢你。

4

2 回答 2

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">
...

在设计时,您应该能够使用滚动偏移量查看您的设计,例如

在此处输入图像描述

而在实际运行时,控件将不会被触及。CustomDesignAttributes设计时水平偏移也有类似的属性local:CustomDesignAttributes.HorizontalScrollTo

于 2013-07-03T11:33:20.003 回答
2

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

在这篇博客文章http://electricbeach.org/?p=862中有更详细的描述

于 2015-02-08T09:35:54.627 回答