2012-08-15 15 views
10

私はVirtualizingStackPanelと奇妙な動作があります。私はTextBlockTextWrap="Wrap"を含むアイテムのリストを持っています。ここでは、コードは次のとおりです。VirtualizingStackPanelと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> 

それはかなり良い作品が、私は(ないprommatically、エミュレータ上でマウスを使用して)非常に高速にスクロールしようとした場合、スクロール中にいくつかの遅れ、おそらくHorizontallOffsetは時々間違って計算されており、中下端は非常に奇妙な結果(画像を参照して、右の画像は正常な動作をdemostrates)。研究の後

scroll bug

私はすべてが正常に動作し、この夫婦から一つの要素を削除する場合、私は、組み合わせVirtualizingStackPanelTextBlock.TextWrap="Wrap"でその問題を考え出しました。

大きなアイテム数のために仮想化が必要で、正しいテキスト表示にはTextWrapが必要です。

私はVirtualizing Panelの独自の実装について考えています。どうすればいいですか、現在の問題を解決する方法を教えてください。

UPD:問題:最初の二つの画像ListBox
がすでにある(これ以上下にスクロールすることはできません)下にスクロールしますが、要素が間違って置かれ、右側に示す正しい配置(!)画像。これは非常に高速にスクロールする場合にのみ発生します。

UPD2:Milan Aggarwalに感謝します。彼は私の問題hereの良い例を提供しました。実際にはListBoxのバグだと思われます。 ListBox内のコントロールと対話する必要があるため、回避策は私のシナリオには適合しません。 は今、私はそれがスクロールを意味し、私は、ページにフォーカスを設定する場合、ManipulationCompletedイベントをキャッチし、それがInertialあるかどうかを確認しようとしている:

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

P.S. )

+4

OFF_TOPIC:VKコンテストで幸運=) –

答えて

1

第2画面の問題は何ですか?あなたは最後のメッセージの後に大きな空のスペースを意味しますか?最後のメッセージはページの最下部に置かれませんか?私はこの権利を得ていますか?

実際に私はあなたのコードやバグを再現しようとしませんでしたが、私のポイントは、あなたのアプリにサードパーティのLIBS(Silverlightのツールキット)を使用していることから、なぜ同様Coding4Fun Toolsを使用しないということですか?

私はこのダミーのクラスを書いた:

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

は、私はメインページのコンストラクタで、このダミーのコードを置く:

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; 

をとXAMLで私は、ツールキットのチャットバブルコントロールとリストボックスを置く:

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

私はそれを実行し、奇妙な動作、おそらく少し遅れて見た。 結果があります:私はいくつかの助けをした

dat pic is huge

はホープ。コンテストで


楽しみ、私は自身が参加するが、それは1.5ヶ月まともなクライアントを作ることができるようになります信じていません。

+0

おかげで、私はこれをチェックしてくださいます。素敵なサンプルテキスト:) – Alexander

+0

いいえ、このコントロールにもこの問題があります。ちょうど異なる高さのアイテムを作ってボタンの中に入れます。たとえば、ボタンをクリックしてスクロールすると、これはバグを再現します – Alexander

+0

私は遭遇した私の最後のプロジェクトのこの問題と私はそれが私の現在のものに存在することは間違いない。しかし、このバグが表示される条件(高速スクロール)は私には普通ではないので、私はそれを修正しようとしませんでした。 =) – Oleg

9

INORDERあなたのスクロール制御を仮想化する必要がスクロールに黒の発生を克服します。そのために、あなたはIListを継承し、あなたのキャッシュの要求に応じて、デフォルトのインデクサを無効にすると同時に、あなたのアイテムのキャッシュを維持する必要がありますするObservableCollectionに似た独自ののCollectionを作成する必要があります。私は、これはあなたが探しているものかもしれないと感じ:http://blogs.msdn.com/b/ptorr/archive/2010/08/16/virtualizing-data-in-windows-phone-7-silverlight-applications.aspx

そのページのサンプルプロジェクトがあります。それを試してみてください。

私はまた、あなたがこの問題http://blog.rsuter.com/?p=258に直面していると感じています。私は、これは、仮想化自体を使用して解決されると思います。それは

+0

ありがとう、あなたは正しい方向に私を指して答えます – Alexander

1

をホープ第二の画像での問題は何ですか?それはBlackAreaが全く現れた、またはそれはスクロールがコンテンツと黒の領域を埋めるために終了した後、ScrollViewは「バウンス」しなかったことであるということですか?

この効果は、WPF/WP7に単に自然である...ので、このことを知ることが重要です。.. ところで。スクロールはオーバースクロール後の「バウンスバック」する必要がありますが、バグがあり、時にはそれを行うことを忘れているようです。

白/黒の領域はWP7上だけでなく、かなり頻繁にありますが、どこでも、慣性スクロールとXAMLish ScrollViewerのがありますどこので、私は聞いていますのよ。プラットフォームよりも高速にスクロールすると、新しいアイテムを提供することができたときにあなたがちょうど突然したがって、項目がないことを発見し、非常に遠くにゆっくり入ってくるアイテムをスクロール「の上に」事前に計算されたアイテムの外に、あなた一度スクロールし、参照してください - バックの空の領域..

いくつかの条件が同時に発生したときにこれが主に起こる:あなたは、高速(イェーイ)をスクロールし、あなたのバインディングが遅い(過度に複雑な式)です、あなたのテンプレートのレンダリングが遅いです(複雑な非再利用可能なUIテンプレート) 、バインディングが(!IEnumerableないIListにバインド - >なし.Count情報)されているどのように多くのアイテムを知らない、またはレンダラは、アイテム(アイテムが一定の高さではなく、eveyrのために予約してどのくらいの高さを知っているdoesntのアイテム)は、それ自身の正確な高さを決定するために計算しなければなりません。

あなたはそれを修正したい場合は、まずそれらの原因と戦う必要があります。また、独自のスクロールを実装したり、スタックパネルを仮想化に侵入し、スクロールが全体の高さを推測できるように、スクロールとのBindingSourceからのアイテムの供給を同期させる必要がありますよりよい:例えば、一度にわずかなアイテムの表示は、):)動的に。これは、高速でスクロールすることができないことで問題を解決するリストの先頭/尾からのアイテムの次のパックを取り外す/イベントをスクロールに耳を傾け、追加) ))

私はアイテムの高さを制約する最も簡単な方法であると信じています。あなたは、一定サイズの実際のアイテムを作るためにスマートな何かを行うことができませんか?

+0

いいえ、項目は異なる高さでなければなりません、彼らはすべての内容を表示する必要があります。 Milan Aggarwalは問題 – Alexander

+0

のデモンストレーションと素晴らしいリンクを投稿しました。私はそれを理解していますし、同じ問題を抱えているアプリがかなりあります。本当に、あなたが指摘しているいくつかのことに集中する必要があります。いくつかの組み合わせは、単にそのような効果を強制するだけです。別のこととして、「慣性スクロール」を無効にし、通常のフラットスクロールを止めようとするかもしれませんが、これは通常、「感情」を低下させるので好ましくありません。私は共通の原因を指すことができます。それ自身の問題は、コード、バインディング、およびレンダリングのパフォーマンスに関するすべてです。 – quetzalcoatl

1

私はあなたがそれに包まれたテキストブロックとバインドのための高さを計算し、できるだけ簡単な関数を作成示唆しています。このように、あなたはリストボックスに高さが可変項目の利益を得るが、仮想化スタックパネルを使用して手にします。