[英]WPF schema - what defines a ListBox to have a ScrollViewer?
多年以來,我一直對WPF不太了解,因為我沒有找到關於此可能性的權威參考。 例如,我剛剛發現ListBox
具有附加的ScrollViewer
屬性。
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Auto">
除了閱讀能說明這一點的書或文章之外,我如何才能知道ScrollViewer
是有效的附加屬性? 是否有XAML架構文檔或其他內容? Visual Studio Designer如何知道?
我相信我們目前擁有的最好的文檔是WPF控件的MSDN文檔頁面。 例如,如果您查找ListBox
,則可以找到有關附加的ScrollViewer
,它也是完整的默認模板。
https://msdn.microsoft.com/zh-CN/library/cc278062(v=vs.95).aspx
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
不必考慮其自身的滾動行為。 全部委托。 通過合成來構建控件非常強大。
不利的一面是,整個東西只是一個巨大的未分化的盒子,很難理解。 當此特定ListBox
模板之外的任何人現在甚至都無法猜測該滾動行為可能是什么時,Intellisense不能告訴您太多有關ListBox
滾動行為的信息。
因此,回答您的問題:是的。 基本上,您只需要閱讀很多東西。 並保留一個“ Cool XAML Tricks”文本文件,以記下您聽說過的尚未使用的好東西。
但這就是該行業一直以來的方式。 即使使用Intellisense,您也無法使用您不知道的類。
今天,我了解了ColumnDefinition.SharedSizeGroup
和Grid.IsSharedSizeScope
,並且我了解了您可以從MarkupExtension
派生值轉換器,並為它們提供強類型的命名屬性,而不必將一些愚蠢的字符串傳遞到CommandParameter
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.