多年来,我觉得我对WPF没有很好的理解,因为我还没有找到关于可能性的权威参考。例如,我发现ListBox
有一个附加的ScrollViewer
属性。
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Auto">
除了阅读书籍或文章之外,我怎么知道ScrollViewer
是有效的附属财产?是否有XAML架构文档或其他内容? Visual Studio Designer如何知道?
答案 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.SetHorizontalScrollBarVisibility
和ScrollViewer.GetHorizontalScrollBarVisibility
,就会看到以下内容。附加属性需要一对这样的静态方法。第一个参数是您要将属性附加到的内容。它不一定是DependencyObject
;它可以是FrameworkElement
,ListBox
,ItemsControl
或其他任何可以支持依赖项属性的内容。
// 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.SharedSizeGroup
和Grid.IsSharedSizeScope
,我了解到你可以从MarkupExtension
派生价值转换器并为它们提供强类型的命名属性,而不必传递一些愚蠢的字符串进入CommandParameter
。