2011-10-06 81 views
2

有沒有一種簡單的方法來禁用ListBox控件上的UI虛擬化? 我試圖使用「FindName()」方法在ListBox控件中找到控件,但是在控件明顯不在Web瀏覽器窗口中的情況下,它找不到控件。我幾乎肯定是UI虛擬化的罪魁禍首。 當控件從頁面滾動時,不再通過「FindName()」檢索成功。Silverlight:禁用UI虛擬化?

第二個我滾動回到屏幕上,它成功返回控件。

這是這個問題的延伸:與編碼例

這背後,我試圖檢索控件的代碼

Silverlight: FrameworkElement.FindName() not finding the control when it's not "visible" in the browser window

更新。 「DynamicTagFormFields」是ListBox控件。

textField tf = DynamicTagFormFields.FindName(s.KeyValue) as textField; 

這將返回一個有效的「文本框」對象如果我試圖檢索實際文本框控件是屏幕到最終用戶上可見。 但是,如果我使用ListBox的垂直滾動條將textField控件拖出視圖,然後再次強制該過程,上述代碼將返回null。

這是ListBox的XAML:

DynamicTagFormFields.Items.Add(textFieldControl); 
+1

我認爲我們實際上發現這有點難以吞嚥,因爲您尚未提供任何可用於單獨重現問題的簡單Xaml。當你說「滾動頁面」時,滾動的是什麼?瀏覽器滾動器? ScrollViewer控件?你所描述的將會破壞很多難以接受的東西。我們需要更多的細節和良好的Xaml repro。 – AnthonyWJones

+0

更新了代碼示例 –

回答

8

你有沒有試過這樣::

<ListBox x:Name="DynamicTagFormFields" Margin="0" Style="{StaticResource ListBoxStyle1}" ItemContainerStyle="{StaticResource ListBoxItemStyle4}" d:LayoutOverrides="Height" Grid.Row="2" IsTabStop="False" TabNavigation="Local" ScrollViewer.HorizontalScrollBarVisibility="Disabled"/> 

TextField對象是動態與下面的代碼添加到列表框編程 -

<ListBox x:Name="DynamicTagFormFields" Margin="0" Style="{StaticResource ListBoxStyle1}" 
    ItemContainerStyle="{StaticResource ListBoxItemStyle4}" d:LayoutOverrides="Height" 
    Grid.Row="2" IsTabStop="False" TabNavigation="Local" 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

默認面板是VirtualisingStackPanel這可能是您的問題的原因LEM。

+0

先生,您是一位紳士和學者。這工作完美。謝謝,我真的很感激。 –

0

http://blogs.msdn.com/b/mcsuksoldev/archive/2010/04/13/performance-characteristics-of-the-silverlight-datagrid.aspx 它說,關於DataGrid的虛擬化,展示兩種方式,你可以關閉它下面的信息的東西,第一個是添加的ScrollViewer周圍的DataGrid這實際上不是建議作爲一種方法,關閉行虛擬化,因爲DataGrid有一個標題行,所以他們也展示瞭如何改變它的XAML模板。對於列表框,雖然不具有這樣的標題,它可能是一個可行的選擇,將其包裝在一個ScrollViewer中,給它無限的大小,從而關閉排虛擬化

...掉落的ScrollViewer圓你的DataGrid 。這給DataGrid 無限大小並有效關閉虛擬化。不幸的是 在我的項目中,我意外地做了這個,卻沒有意識到 對性能的影響。你真的需要使用DataGrid的滾動 酒吧,而不是ScrollViewer。請注意,如果您想關閉虛擬化(例如對於小型網格),可以重新設置DataGrid 的模板,並將RowsPresenter放置在ScrollViewer中,這又會導致 它認爲它具有無限大小。這很有用,因爲在滾動時,您不會收到LoadingRow和UnloadingRow事件 。 小心地做到這一點,以便列標題正確滾動 (請參閱本文末尾的附錄中的XAML)。