指定面板的滚动所有者

时间:2014-02-18 13:04:17

标签: c# wpf

我有ScrollViewer分层内容。 E.g:

<ScrollViewer>
   <Grid>
      <Child x:Name="Layer1" />
      <Child x:Name="Layer2" />
      <Child x:Name="Layer3" />
   </Grid>
</ScrollViewer>

孩子们需要彼此重叠并且具有相同的大小。现在,我的Child类实现了IScrollInfo。考虑上面的网格。我想选择一个孩子作为ScrollViewer的所有者。因此,“Layer1”将更新滚动条,其他层将确保它们具有与滚动所有者相同的大小。这样的事情会很棒:

<Grid ScrollViewer.ScrollOwner="Layer1">

显然,Grid是在这里使用的错误控件。 WPF是否支持上述开箱即用的功能?如果没有,那么实现这种行为的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

没有什么特别优雅的想法。一个(稍微繁琐)选项是将Grid子类化为实现IScrollInfo并将所有此类功能委托给适当的子级,可能通过自定义网格上的属性设置。即沿着:

public IScrollInfo Scroller { get; set; }

bool IScrollInfo.CanHorizontallyScroll
{
    get { return Scroller.CanHorizontallyScroll; }
    set { Scroller.CanHorizontallyScroll = value; }
}

你需要注意这个重定向在ScrollViewer使用之前就已经足够早地安排,这可能很痛苦。

另一个选项是注意ScrollViewer具有ScrollInfo受保护属性以指向IScrollInfo子对象。你可以继承ScrollViewer并设置它,虽然这看起来有点hacky - 我只是尝试过,并且不清楚何时必须设置它。

最后,您可以考虑存在一些设计问题,即您有3个兄弟姐妹,其中一个比其他人“更特殊” - 也许您真的应该有一个包含这些孩子的自定义面板来定义您的{{1}行为。

请注意,您使用的术语IScrollInfo已经是ScrollOwner中用于引用控制滚动查看器的概念。