2009-07-24 24 views
5

SeveralotherquestionsonSO đã đi đến kết luận tương tự Tôi có - sử dụng một ItemsControl với một DataTemplate cho từng hạng mục xây dựng để ghi vị trí như vậy rằng chúng giống với một lưới điện đơn giản hơn nhiều (đặc biệt là định dạng) hơn là sử dụng một ListView.WPF - Làm thế nào để ngăn chặn cột một ItemsControl giả lưới từ múa/nhảy xung quanh trong bố trí

Mã này tương tự như:

<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> 

Vấn đề tôi đang nhìn thấy là bất cứ khi nào tôi trao đổi các đối tượng mà ItemsSource là ràng buộc (nó là một ObservableCollection mà tôi thay thế các tham chiếu đến, chứ không phải là rõ ràng và tái -add), toàn bộ 'lưới' nhảy múa trong vài giây.

Có lẽ nó đang thực hiện một vài lần bố cục để nhận tất cả các cột Auto-độ rộng để khớp.

Điều này rất mất tập trung cho người dùng của tôi và tôi muốn nó được phân loại. Đã có người khác nhìn thấy điều này?

+0

Tôi gặp vấn đề tương tự. Bạn đã bao giờ nhận được một giải pháp này? –

+0

@Rick: tiếc là không, tôi chưa bao giờ tìm ra những gì đang xảy ra ở đây. Thật khó chịu khi tôi chỉ chọn các cột có chiều rộng cố định, mặc dù tất nhiên là đi kèm với một tập hợp các vấn đề khác. Đó là tội ác ít hơn, trong trường hợp của tôi. –

+0

@Rick, bạn có lưu trữ bên trong WinForms không? Sẽ rất tốt nếu có được một trường hợp repro cho việc này. Bạn đang sử dụng phiên bản .NET nào? Tôi đã sử dụng 3,5 (pre-SP1). –

Trả lời

0

Rất tiếc, tôi không thể tạo lại sự cố với mã được cung cấp. Tôi đã thử nó trao đổi mẫu của 20 lên đến 1000 mục, và với 100 độ rộng khác nhau bên trong bộ sưu tập. Không có gì khiêu vũ. Trên các bộ sưu tập khổng lồ (200 trở lên), giao diện người dùng được sử dụng để treo trong một thời gian và sau đó phát hành, hiển thị lưới mới với các mục được cung cấp.

+0

@Archimed, cảm ơn vì đã thử điều này. Tôi đã nhìn thấy nó xảy ra ở một vài nơi khác nhau trong giao diện người dùng của tôi với ít nhất là 5 hàng, và đã phải đi cho cột cố định chiều rộng mà không có IsSharedSizeScope để tránh các jiggling. Tôi tự hỏi liệu nó có liên quan đến việc lưu trữ các phần tử của tôi trong WinForms ElementHosts hay không ... –

1

Có vẻ như nội dung của lưới phải ở mức độ phức tạp nhất định trước khi vấn đề này hiển thị.

TextBlock đơn giản như được hiển thị trong OP có thể không hiển thị vấn đề khá dễ dàng vì chúng là kích thước tĩnh. Nếu bạn ném TextBox (không phải TextBlock) vào ô, sau đó tại thời gian chạy, nhập đủ văn bản để làm cho TextBox tự động mở rộng ô, bạn sẽ thấy nó bắt đầu nhảy ngay lập tức ... đường quá nhiều để có thể chấp nhận được. Tôi đã có 7 hàng trong ItemsControl của tôi.

Điều này có hiệu quả làm cho phương pháp tiếp cận IsSharedSizeScope + ItemsControl được quảng cáo trở nên hoàn hảo, đặc biệt đối với nội dung Lưới có định dạng TextBox có thể chỉnh sửa.

Đối với nhu cầu của tôi, phương pháp ListView hoặc đúng hơn "ItemsControl + GridViewRowPresenter" như được trình bày herehere là một giải pháp thay thế trực tiếp và không có bất kỳ vấn đề bố cục nào.

Đối với những người hỏi "tại sao không phải là một DataGrid?": DataGrid áp đặt một cách tiếp cận nhất định để chỉnh sửa. Tôi đã sẵn sàng để làm việc thông qua tất cả những gì nhưng vết thương lên ở một kết thúc chết với cách DataGrid mangles Validation.Error hỗ trợ. Các hộp Error Validation Error màu đỏ sẽ làm việc tốt cho DataGridTextColumn đơn giản nhưng cho DataGridTemplateColumns (cần thiết để cung cấp nhiều hơn một TextBox trong một cột), ban đầu sẽ hiển thị các hộp màu đỏ và sau đó không nhất quán ẩn chúng dựa trên nơi bạn đã xảy ra Lưới dữ liệu. Khi xác nhận tiếp theo làm mới chúng sẽ hoàn toàn vô hình. (ví dụ cũ: http://code.google.com/p/itraacv2-1/source/browse/trunk/scraps/tabSponsor%20-%20before%20deactive%20rewrite.xaml, tìm kiếm xuống "nugget: cho cuộc sống friggin của tôi" ...)

Toàn bộ nguồn dự án của tôi là trực tuyến. Cách tiếp cận GridViewRowPresenter này được thể hiện ở đây: http://code.google.com/p/itraacv2-1/source/browse/trunk/App/View/tabSponsor.xaml

1

Thử đặt MinWidth trên tất cả các cột lưới của bạn.

Tôi cũng đã trải qua sự bất ổn tăng vọt này. Tuy nhiên, tôi đã kiểm soát nó bằng cách chỉ định một MinWidth được đặt trên tất cả các cột lưới của tôi. Điều này dường như ổn định mọi thứ khi màn hình được hiển thị lần đầu tiên. Tất nhiên, bởi vì các cột của bạn vẫn được liên kết, chúng phát triển đến độ rộng tối đa của bất kỳ điều khiển nào thắng.

Ngoài ra, tắt IsSharedSizeScope và cố gắng để lưới của bạn xếp hàng trước, sau đó bật lại.

+0

Đặt thuộc tính 'MinWidth' làm việc cho tôi. –

+0

Bạn có thể đặt 'MinWidth' thành thứ gì đó rất nhỏ, sao cho nó không lãng phí bất kỳ chiều rộng nào không cần thiết? –

0

Tôi đã gặp vấn đề tương tự, tôi đã thử đặt MinWidth như được đề xuất trong một trong các câu trả lời, nhưng nó không hiệu quả với tôi. Điều gì đã giúp, đã được ràng buộc chiều rộng từ một Grid khác. Tôi để lại một số các cột với SharedSizeGroup, và không có gì nhảy:

<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> 

Tôi không biết có bao nhiêu cột mà bạn có thể để lại với SharedGroupSize và bao nhiêu trong số họ cần phải bị ràng buộc, vì vậy bạn có thể chơi xung quanh với các cột để xem những gì phù hợp với bạn.

Các vấn đề liên quan