簡體   English   中英

WPF模式-什么定義了具有ScrollViewer的ListBox?

[英]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.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不必考慮其自身的滾動行為。 全部委托。 通過合成來構建控件非常強大。

不利的一面是,整個東西只是一個巨大的未分化的盒子,很難理解。 此特定ListBox模板之外的任何人現在甚至都無法猜測該滾動行為可能是什么時,Intellisense不能告訴您太多有關ListBox滾動行為的信息。

因此,回答您的問題:是的。 基本上,您只需要閱讀很多東西。 並保留一個“ Cool XAML Tricks”文本文件,以記下您聽說過的尚未使用的好東西。

但這就是該行業一直以來的方式。 即使使用Intellisense,您也無法使用您不知道的類。

今天,我了解了ColumnDefinition.SharedSizeGroupGrid.IsSharedSizeScope ,並且我了解了您可以從MarkupExtension派生值轉換器,並為它們提供強類型的命名屬性,而不必將一些愚蠢的字符串傳遞到CommandParameter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM