2012-08-15 28 views
10

Tôi có một hành vi lạ với VirtualizingStackPanel. Tôi có một danh sách có các mặt hàng có chứa TextBlock với TextWrap="Wrap". Đây là mã:VirtualizingStackPanel và lỗi TextWrapping? Windows Phone

<ListBox x:Name="messagesList" ItemsSource="{Binding Messages}" > 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <toolkit:ContextMenuService.ContextMenu> 
        <toolkit:ContextMenu> 
        ... 
        </toolkit:ContextMenu> 
       </toolkit:ContextMenuService.ContextMenu> 
       <CheckBox Style="{Binding Own, Converter={StaticResource MsgTypeToStyle}}" 
          Tag="{Binding TimeString}" 
          IsEnabled="True"> 
        <TextBlock Text="{Binding Content}" TextWrapping="Wrap"/> 
       </CheckBox> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Nó hoạt động khá tốt, nhưng nếu tôi cố gắng di chuyển rất nhanh (sử dụng chuột trên giả lập, không prommatically) có một số tụt hậu trong cuộn, có lẽ HorizontallOffset đôi khi tính toán sai lầm, và trong dưới cùng trong kết thúc với kết quả rất lạ (xem hình ảnh, hình ảnh bên phải demostrates hành vi bình thường).

scroll bug

Sau khi nghiên cứu tôi đã tìm ra vấn đề mà kết hợp VirtualizingStackPanelTextBlock.TextWrap="Wrap", nếu tôi loại bỏ một phần tử từ cặp vợ chồng này tất cả các hoạt động chính xác.

Nhưng tôi cần ảo hóa vì số lượng mục lớn và TextWrap để hiển thị văn bản chính xác.

Vì vậy, tôi nghĩ đến việc triển khai Bảng ảo hóa của riêng tôi, bạn có thể hướng dẫn tôi, cách thực hiện việc này hay cách khắc phục sự cố hiện tại?

UPD: Vấn đề: (!)
trên hai hình ảnh đầu tiên ListBox đã cuộn xuống cuối (nó không thể được cuộn xuống nữa), nhưng yếu tố được đặt không đúng cách, đúng đặt hiển thị bên phải hình ảnh. Điều này xảy ra chỉ khi bạn sẽ cuộn rất nhanh.

UPD2: Nhờ Milan Aggarwal. Ông đã cung cấp một trường hợp tốt về vấn đề của tôi here. Dường như đó thực sự là một lỗi trong ListBox. Workaround, cung cấp không phù hợp trong kịch bản của tôi, bởi vì tôi cần phải tương tác với các điều khiển bên trong ListBox mục. Bây giờ tôi đang cố gắng để bắt ManipulationCompleted sự kiện và kiểm tra xem nó là Inertial, nếu có thì đó có nghĩa là cuộn và tôi đặt tập trung to page:

void messagesList_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) 
    { 
     if (e.IsInertial) 
      this.Focus(); 
    } 

T.B. cảm ơn vì chúc may mắn;)

+4

OFF_TOPIC: Chúc may mắn trong cuộc thi VK =) –

Trả lời

1

Sự cố trên màn hình thứ 2 là gì? Bạn có nghĩa là không gian trống lớn sau tin nhắn cuối cùng? Tin nhắn cuối cùng không được đặt ở cuối trang? Tôi có nhận được quyền này không?

Trên thực tế tôi đã không cố gắng tái tạo mã và lỗi của bạn nhưng quan điểm của tôi là kể từ khi bạn đang sử dụng libs bên thứ 3 (Silverlight Toolkit) trong ứng dụng của bạn, tại sao không sử dụng Coding4Fun Tools không?

tôi đã viết lớp giả này:

public class Message 
{ 
    public string Time { get; private set; } 
    public string Content { get; private set; } 

    public Message(string time, string content) 
    { 
     Time = time; 
     Content = content; 
    } 
} 

Sau đó, tôi đặt mã giả này trong constructor trang chính:

var _messages = new ObservableCollection<Message>(); 

for (int i = 0; i < 50; i++) 
{ 
    _messages.Add(new Message("12:40", "Teh very long string which should be wrapped. Pavel Durov gives WP7 Contest winners less money than he did for Android/iOS winners. FFFUUUUUUUUUUUUUU ")); 
} 

this.ListBox.ItemsSource = _messages; 

Và trong XAML tôi đặt một ListBox kiểm soát bong bóng chat của bộ công cụ:

<ListBox x:Name="ListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <c4fToolkit:ChatBubble> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 
        <TextBlock Grid.Row="0" 
           Text="{Binding Content}" 
           TextWrapping="Wrap"/> 
        <TextBlock Grid.Row="1" 
           Text="{Binding Time}" 
           HorizontalAlignment="Right"/> 
       </Grid> 
      </c4fToolkit:ChatBubble> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Tôi chạy nó và thấy không có hành vi lạ, có thể hơi chậm trễ. Có là kết quả:

dat pic is huge

Hope tôi đã làm một số giúp đỡ.


vui vẻ với cuộc thi, tôi tự sẽ tham gia, nhưng không tin rằng sẽ có thể làm cho một khách hàng khá cho 1,5 tháng.

+0

cảm ơn, tôi sẽ kiểm tra này ra.văn bản mẫu đẹp :) – Alexander

+0

không, điều khiển này cũng có vấn đề này, chỉ cần làm cho các mục có chiều cao khác nhau và đặt bên trong chúng nút ví dụ, bấm vào bất kỳ nút và di chuyển, điều này sẽ tái tạo lỗi – Alexander

+0

Tôi vừa nhớ rằng tôi gặp phải vấn đề này trên dự án cuối cùng của tôi và tôi không có nghi ngờ nó tồn tại trong hiện tại của tôi. Nhưng các điều kiện lỗi này xuất hiện trên (nhanh chóng di chuyển) không bình thường đối với tôi vì vậy tôi đã không cố gắng sửa chữa nó. =) – Oleg

9

Inorder để vượt qua sự xuất hiện màu đen trên di chuyển bạn cần để ảo hóa kiểm soát di chuyển của bạn. Cho rằng bạn nên kế thừa IList và tạo ra một Collection tương tự của riêng bạn để ObservableCollection trong đó bạn sẽ phải ghi đè lên indexer mặc định tùy thuộc vào yêu cầu bộ nhớ đệm của bạn và đồng thời duy trì một bộ nhớ cache cho các hạng mục của bạn. Tôi cảm thấy điều này có thể là những gì bạn đang tìm kiếm: http://blogs.msdn.com/b/ptorr/archive/2010/08/16/virtualizing-data-in-windows-phone-7-silverlight-applications.aspx

Có một dự án mẫu trên trang đó. Cố gắng mà ra.

Tôi cũng cảm thấy rằng bạn đang phải đối mặt với vấn đề này http://blog.rsuter.com/?p=258. Tôi đoán đây sẽ được giải quyết bằng ảo hóa riêng của mình. Hy vọng nó giúp

+0

cảm ơn bạn, bạn trả lời chỉ cho tôi theo đúng hướng – Alexander

1

các vấn đề ở hình ảnh thứ hai là gì? Là nó rằng BlackArea xuất hiện ở tất cả, hoặc là nó rằng scrollview không "bounceback" sau khi di chuyển kết thúc để lấp đầy diện tích màu đen với nội dung?

Điều quan trọng là phải biết điều này, bởi vì ... hiệu ứng này chỉ đơn giản là tự nhiên để WPF/WP7 .. BTW. các cuộn nên "bounceback" sau khi quá di chuyển, nhưng có vẻ như nó có một lỗi và đôi khi quên để làm điều đó.

Tôi hỏi vì màu đen/trắng khu vực là khá thường xuyên không chỉ trên WP7, nhưng bất cứ nơi nào và ở đâu có một XAMLish ScrollViewer với di chuyển quán tính. Bạn thấy đấy, khi di chuyển nhanh hơn so với nền tảng này có thể cung cấp các mặt hàng mới, bạn chỉ cần di chuyển bên ngoài các mặt hàng tính trước và một khi bạn "trên" di chuyển rất xa, các hạng mục chậm-đến bất ngờ phát hiện ra rằng không có đối tượng nào, do đó - trở lại vùng trống ..

điều này xảy ra chủ yếu khi một số điều kiện xảy ra cùng một lúc: bạn di chuyển nhanh (yay), ràng buộc của bạn là chậm (biểu thức quá phức tạp), mẫu-vẽ của bạn là chậm (phức tạp không thể tái sử dụng giao diện người dùng mẫu) , các ràng buộc không biết có bao nhiêu mặt hàng có được (bị ràng buộc để IEnumerable không IList -> không có thông tin Count), hoặc doesnt renderer biết bao nhiêu chiều cao dự trữ cho một mục (item phải là không đổi chiều cao, nhưng eveyr mục phải được tính toán để xác định chiều cao chính xác của riêng mình).

Nếu bạn muốn sửa nó, bạn phải chiến đấu với những nguyên nhân đầu tiên hoặc bạn phải thực hiện cuộn của riêng bạn hoặc hack vào ảo hóa ngăn xếp bảng điều khiển và đồng bộ hóa các thức ăn của các mục từ BindingSource với di chuyển để cho các cuộn đoán tổng chiều cao tốt hơn: ví dụ, chỉ hiển thị một mục nhỏ cùng một lúc, nghe di chuyển các sự kiện và thêm/gỡ bỏ gói tiếp theo của các mục từ đầu/đuôi của danh sách tự động .. Điều này sẽ giải quyết vấn đề bằng cách không cho phép để cuộn nhanh :)))))

tôi tin rằng hạn chế chiều cao mục là cách dễ nhất. bạn không thể làm điều gì đó thông minh để thực hiện các mục thực sự ổn định kích thước?

+0

không, các mục phải có chiều cao khác nhau, chúng phải hiển thị tất cả nội dung của chúng. Milan Aggarwal đăng một liên kết tuyệt vời với trình diễn vấn đề – Alexander

+0

Tôi hiểu điều đó và tôi có khá một vài ứng dụng với cùng một vấn đề. Thực sự, bạn phải tập trung vào một vài điều tôi đã chỉ ra. Một số kết hợp sau đó chỉ đơn giản là ép buộc hiệu ứng đó. Một điều nữa, bạn có thể cố gắng vô hiệu hóa "quán tính-di chuyển" và để lại bình thường, cuộn phẳng, nhưng thường cũng không thuận lợi vì điều này làm giảm "cảm giác" .. Tôi không thể giúp bạn thêm mà không nhìn thấy trường hợp chính xác của bạn. Tôi chỉ có thể chỉ ra những nguyên nhân phổ biến. Vấn đề nó là tất cả về hiệu suất của mã, các ràng buộc và kết xuất của bạn. – quetzalcoatl

1

tôi đề nghị bạn tạo ra các chức năng đơn giản nhất có thể là tính một chiều cao cho TextBlock bọc và bám vào đó. Bằng cách này, bạn sẽ có được lợi ích của các mặt hàng cao biến trong hộp danh sách, nhưng có được tiếp tục sử dụng bảng điều khiển ngăn xếp ảo hóa.