2016-04-14 45 views
0

多年來,我覺得我對WPF沒有很好的理解,因爲我沒有找到有關可能性的權威參考。例如,我剛發現ListBox有一個附加的ScrollViewer屬性。WPF模式 - 什麼定義ListBox有一個ScrollViewer?

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Auto"> 

除了讀一本書或一篇文章,告訴我怎麼會知道ScrollViewer是一個有效的附加屬性?是否有XAML模式文檔或什麼? Visual Studio Designer如何知道?

回答

1

ScrollViewer不是一個附加屬性;這是一堂課。

ScrollViewer.HorizontalScrollBarVisibility是附屬財產。但它不是ListBox「擁有」的附屬財產;它是一個附加的屬性,可以連接到任何DependencyObject,包括ListBox

如果您右鍵點擊ScrollViewer.SetHorizontalScrollBarVisibilityScrollViewer.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

所以,回答你的問題:是的。基本上你只需要閱讀很多東西。並保留一個「酷XAML技巧」文本文件記下你聽到的很酷的東西,你還沒有使用。

但這就是這個行業一直的方式。即使使用Intellisense,也不能使用您不瞭解的課程。

今天我學到了ColumnDefinition.SharedSizeGroupGrid.IsSharedSizeScope,我瞭解到,你可以從MarkupExtension獲得價值轉換器,並給他們,而不是有一些愚蠢的字符串傳遞到CommandParameter強類型,命名屬性。

+0

謝謝,這是真的ListBox有一個ScrollViewer,它是該對象的屬性正在'ScrollViewer.Horizo​​ntalScrollbarVisibility'。雖然很明顯listbox可以滾動,但確實會拼出使用IntelliSense或其他工具,而不是絆倒某些文檔,某個地方,某天,比如'ColumnDefinition.SharedSizeGroup'學到了。 WPF無法像Winforms控件一樣被發現。所以當有人問我WPF程序員有多好時,答案是,我不知道。 –

+0

@DavidChing ScrollViewers是如何在WPF中滾動的。學習的一個好方法是右鍵單擊XAML desginer視圖中的東西(這是我發現的唯一有用的東西)並查看其模板。但有人可以用一個沒有ScrollViewer的模板來替換模板,而某些螺母可以給一個特定的RadioButton一個有ScrollViewer的模板。它的本質就是你有這個可以在任何地方出現的大盒子。這不僅僅是它沒有很好的記錄,從某種意義上說,它在一般水平上幾乎是不可知的。 –

+0

這是關於它是不可知的一個很好的觀察,並提示查看模板,謝謝。 –

1

我相信我們現在最好的文檔是MSDN WPF控件的文檔頁面。例如,如果您查找ListBox,則可以找到有關所附ScrollViewer的信息,並且它也是完整的默認模板。

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

+0

這是一個好的開始,謝謝。然而,這並沒有提到可以用像普通的'StackPanel'這樣的東西替代ListBox的默認'ItemsPanel',它是'VirtualizingStackPanel'。這是[這裏](https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemspanel(v = vs.110).aspx)提到的,但它一點也不清楚我如何獲得這個頁面。 –

+0

正確,替換模板只是WPF樣式屬性的一部分。您可以替換幾乎所有控件的模板。我可能會推薦閱讀WPF釋放,因爲它確實覆蓋了控件的模板樣式。 –

+0

我買了很多書,包括那本。 :-)我所追求的是可能的最終來源。 Visual Studio XAML Designer IntelliSense如何工作?這似乎知道XAML中的所有法律。實際上,我對WPF編程的定義是使用IntelliSense絆倒可能性,然後谷歌什麼顯示.... –