WPF架构 - 什么定义了一个包含ScrollViewer的ListBox?

时间:2016-04-14 16:40:54

标签: wpf xaml schema

多年来,我觉得我对WPF没有很好的理解,因为我还没有找到关于可能性的权威参考。例如,我发现ListBox有一个附加的ScrollViewer属性。

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Auto">

除了阅读书籍或文章之外,我怎么知道ScrollViewer是有效的附属财产?是否有XAML架构文档或其他内容? Visual Studio Designer如何知道?

2 个答案:

答案 0 :(得分:1)

我相信我们现在拥有的最佳文档是WPF控件的 MSDN 文档页面。例如,如果您查找ListBox,则可以找到有关附加ScrollViewer的信息,以及它的完整默认模板。

https://msdn.microsoft.com/en-us/library/cc278062(v=vs.95).aspx

答案 1 :(得分:1)

ScrollViewer不是附属财产;这是一堂课。

ScrollViewer.HorizontalScrollBarVisibility是附属财产。但它不是ListBox“拥有”的附属物;它是一个附加属性,可以附加到任何DependencyObject,包括ListBox

如果您右键点击ScrollViewer.SetHorizontalScrollBarVisibilityScrollViewer.GetHorizontalScrollBarVisibility,就会看到以下内容。附加属性需要一对这样的静态方法。第一个参数是您要将属性附加到的内容。它不一定是DependencyObject;它可以是FrameworkElementListBoxItemsControl或其他任何可以支持依赖项属性的内容。

// Summary:
//     Sets the value of the System.Windows.Controls.ScrollViewer.HorizontalScrollBarVisibility
//     dependency property to a given element.
//
// Parameters:
//   element:
//     The element on which to set the property value.
//
//   horizontalScrollBarVisibility:
//     The property value to set.
public static void SetHorizontalScrollBarVisibility(DependencyObject element, ScrollBarVisibility horizontalScrollBarVisibility);

//
// Summary:
//     Gets the value of the System.Windows.Controls.ScrollViewer.HorizontalScrollBarVisibility
//     dependency property from a given element.
//
// Parameters:
//   element:
//     The element from which the property value is read.
//
// Returns:
//     The value of the System.Windows.Controls.ScrollViewer.HorizontalScrollBarVisibility
//     dependency property.
public static ScrollBarVisibility GetHorizontalScrollBarVisibility(DependencyObject element);

ListBox本身很可能不知道ScrollViewer.HorizontalScrollBarVisibility的含义,甚至它是否存在。但是在ListBox的模板中,可能有ScrollViewer,它可能会有很多这样的绑定:

<ScrollViewer
    HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"

将附加属性放在其模板中可能包含ScrollViewer的任何控件上,如果模板编写正确,ScrollViewer将使用该值。

这真的非常好,因为ListBox不必考虑自己的滚动行为。这都是委托的。通过构图构建控件非常强大。

缺点是整个事情只是一大堆无差别的barf而且真的很难理解。当{em>那个特定的ListBox模板之外的任何人甚至无法猜出滚动行为可能是什么时,Intellisense无法告诉您更多关于ListBox的滚动行为。

所以,回答你的问题:是的。基本上你只需要阅读很多东西。并保留一个“酷XAML技巧”文本文件,记下你听说过你还没有用的很酷的东西。

但这就是这个职业一直以来的方式。即使使用Intellisense,也不能使用您不了解的课程。

今天我了解了ColumnDefinition.SharedSizeGroupGrid.IsSharedSizeScope,我了解到你可以从MarkupExtension派生价值转换器并为它们提供强类型的命名属性,而不必传递一些愚蠢的字符串进入CommandParameter