2009-07-24 18 views
5

SeveralotherquestionsonSO中跳來跳去都得出了​​同樣的結論,我有 - 用ItemsControlDataTemplate每個項目構造位置等項目它們類似於網格比使用ListView更簡單(尤其是格式化)。WPF - 如何停止一個ItemsControl僞網格的行從舞蹈/佈局

代碼類似於:

<StackPanel Grid.IsSharedSizeScope="True"> 
    <!-- Header --> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" SharedSizeGroup="Column1" /> 
     <ColumnDefinition Width="Auto" SharedSizeGroup="Column2" /> 
    </Grid.ColumnDefinitions> 
    <TextBlock Grid.Column="0" Text="Column Header 1" /> 
    <TextBlock Grid.Column="1" Text="Column Header 2" /> 
    </Grid> 
    <!-- Items --> 
    <ItemsControl ItemsSource="{Binding Path=Values, Mode=OneWay}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <Grid> 
      <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Column1" /> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Column2" /> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="0" Text="{Binding ColumnProperty1}" /> 
      <TextBlock Grid.Column="1" Text="{Binding ColumnProperty2}" /> 
     </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</StackPanel> 

我看到的問題是,每當我換到了ItemsSource被綁定的對象(它是一個ObservableCollection我更換參考,而不是明確的和再 - 添加),整個「網格」跳舞幾秒鐘。

想必它會進行一些佈局傳遞以獲得所有Auto -width列的匹配。

這對我的用戶來說非常干擾,我想把它整理出來。有沒有人看過這個?

+0

我有完全相同的問題。你有沒有得到這個決議? – 2011-01-19 00:06:36

+0

@瑞克:不幸的是,我從來沒有研究過這裏發生了什麼。這太讓人討厭了,我只是選擇了固定寬度的列,儘管當然有不同的問題。就我而言,這是一個較小的罪惡。 – 2011-01-19 12:25:32

+0

@Rick,你在WinForms裏面託管?爲此得到一個repro案例會很好。你使用的是什麼版本的.NET?我使用3.5(SP1之前)。 – 2011-01-19 12:26:36

回答

0

不幸的是我無法用所提供的代碼重現問題。我已經試過將20個樣品換成1000個樣品,並在樣品收集中加入100個不同的寬度。沒有什麼是跳舞。在巨大的集合(200及更高版本)用戶界面用於暫停一段時間然後釋放,顯示提供的項目新的網格。

1

在看到這個問題之前,看起來網格的內容必須達到一定的複雜程度。

在OP中顯示的簡單TextBlock的可能不會很容易地顯示問題,因爲它們是靜態大小。如果在單元格中輸入TextBox(不是TextBlock),則在運行時輸入足夠的文本以使文本框自動展開單元格,您應該看到它馬上就開始跳舞......它完全勝過太可接受的線。我在ItemsControl中有7行。

這有效地呈現了大量推廣的IsSharedSizeScope + ItemsControl方法,該方法是一個完整的不可行,專門用於可編輯的,面向TextBox的Grid內容。

對於我的需求,ListView或者像「ItemsControl + GridViewRowPresenter」方法herehere是一個非常直接的選擇,並沒有任何這些佈局問題。

對於那些問「爲什麼不DataGrid?」的人:DataGrid強加了一定的編輯方法。我願意努力解決所有這些問題,但最終都無法解決DataGrid如何破壞Validation.Error支持。對於簡單的DataGridTextColumn,對於DataGridTemplateColumns(必須在一列中提供多個單獨的TextBox),小紅色的驗證錯誤框可以正常工作,它將首先顯示紅色框,然後根據您碰巧點擊的位置不一致地隱藏它們數據網格。在隨後的驗證刷新後,它們將完全不可見。 (舊的例子:http://code.google.com/p/itraacv2-1/source/browse/trunk/scraps/tabSponsor%20-%20before%20deactive%20rewrite.xaml,搜索到「nugget:爲了我的冷靜生活」...)

我的整個項目源都在線。此GridViewRowPresenter方法如下所示: http://code.google.com/p/itraacv2-1/source/browse/trunk/App/View/tabSponsor.xaml

1

嘗試在所有網格列上設置MinWidth。

我也經歷過這種跳動的不穩定性。不過,我通過在我的所有網格列上指定一組MinWidth來控制它。當屏幕第一次顯示時,這似乎穩定了事物。當然,因爲你的專欄仍然是連結的,所以它們的成長幅度達到任何控制勝出的最大寬度。

此外,關閉IsSharedSizeScope並嘗試讓您的網格先排隊,然後重新打開它。

0

我有同樣的問題,我試圖設置MinWidth像其中一個答案中的建議,但它沒有爲我工作。有什麼幫助,是從一個網格到另一個網格的寬度綁定。我留下了一些列的與SharedSizeGroup,並沒有什麼跳躍:

<Grid Grid.IsSharedSizeScope="True"> 
... 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Group0"/> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Group1"/> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Group2"/> 
      <ColumnDefinition Width="Auto" x:Name="Column3"/> 
      <ColumnDefinition Width="Auto" x:Name="Column4"/> 
      <ColumnDefinition Width="Auto" x:Name="Column5"/> 
     </Grid.ColumnDefinitions> 
    ... 
    </Grid> 

    <ItemsControl> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Group0"/> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Group1"/> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Group2"/> 
         <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column3}"/> 
         <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column4}"/> 
         <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column5}"/> 
        </Grid.ColumnDefinitions> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
... 
</Grid> 

我不知道你能有多少列與SharedGroupSize離開,需要有多少人被束縛,所以你可以玩查看哪些列適合您。