我希望從C#動態更改Silverlight ListBox的滾動位置,我需要知道如何從C#中訪問ListBox控件的ScrollViewer元素?如何訪問Silverlight/C#中的ListBox控件的ScrollViewer元素?
謝謝你們, 傑夫
我希望從C#動態更改Silverlight ListBox的滾動位置,我需要知道如何從C#中訪問ListBox控件的ScrollViewer元素?如何訪問Silverlight/C#中的ListBox控件的ScrollViewer元素?
謝謝你們, 傑夫
好問題。我沒有找到直接做這件事的方法,但是通過查看Silverlight控件項目(他們在一些類的項目控件上使用scrollviewer)來得相當接近。這裏是你如何能得到它,但它需要一個自定義列表框:
public class TestBox : ListBox
{
private ScrollViewer _scrollHost;
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
var itemsHost = VisualTreeHelper.GetParent(element) as Panel;
for (DependencyObject obj = itemsHost; obj != item && obj != null; obj = VisualTreeHelper.GetParent(obj))
{
ScrollViewer viewer = obj as ScrollViewer;
if (viewer != null)
{
_scrollHost = viewer;
break;
}
}
base.PrepareContainerForItemOverride(element, item);
}
}
有可能是另一種方式來掛鉤到該事件(或其他方式來獲得該面板),如果你看一下的模板ListBox你會看到滾動查看器實際上被命名爲「ScrollViewer」,但GetTemplateChild方法受到保護,所以你仍然需要創建一個自定義類。
從從ListBox類繼承的類中,你可以使用受保護GetTemplateChild():
var myScrollviewer = myListBox.GetTemplateChild("ScrollViewer") as ScrollViewer;
如果你想從列表框外部訪問這個,然後通過一個露出的ScrollViewer財產應該繼續工作,通過繼承。
CAVEAT:如果您設置了自己的自定義模板,則此滾動查看器可能不存在。您可以在上述方法中使用模板Scrollviewer名稱而不是「ScrollViewer」。
ScrollViewer scrollViewer = yourListBox.getScrollHost();
爲空,如果沒有datasourse設置列表框,在我的情況下,它返回正確的UI元素下後才執行的代碼
myListBox.ItemsSource = list;
您可以撥打:
myListBox.ApplyTemplate();
給力要創建ListBox可視化樹,否則GetTemplateChild()將立即返回Null,如果試圖立即訪問它。
此作品與「Erno de Weerd」結合得很好解釋:繼承ListBox可以調用GetTemplateChild()方法。
我也試過:
靈光(Silverlight 3中)
讓我們可以很容易... 在你的列表框模板,你可能會發現ScrollViewer控件。 爲它添加一個加載的方法,並且您將自己獲得發件人arg的身份。
private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
myScrollViewer = (sender as ScrollViewer);
}
這對我的作品
GetTemplateChild顯示是一個受保護的方法。這是新的嗎?因爲現在看來你的解決方案不再有效了。 http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx – 2011-03-10 21:56:13