12月 022015
 

概要

一般的に、private setter を持つプロパティを TwoWay Binding すると、InvalidOperationException が発生して死ぬ。
しかし、ターゲットフレームワークが 4.5 の時のみ、何事もなかったかのように動作する。なにそれ……

※ OneWayToSource の場合も同様。

Continue reading »

9月 032015
 

条件をよく忘れるのでメモ。

条件

  • ItemsPanelVirtualizingPanel であること
    • だいたい VirtualizingStackPanel
  • VirtualizingPanel.IsVirtualizingTrue (既定値) であること
  • ScrollViewer.CanContentScrollTrue であること
    • 既定値は False
  • グループ化してる場合は VirtualizingPanel.IsVirtualizingWhenGroupingTrue

ListView なんかは初めから仮想化有効だけど、Template 弄る時なんかに無効化されてしまったりするので注意

既定値が気に食わないやつとか

  • VirtualizingPanel.VirtualizationModeRecycling
    • 使いまわしたほうがパフォーマンス良い
  • VirtualizingPanel.ScrollUnitPixel
    • 既定値の Item はスクロールしてる感乏しい
    • タッチだとカクカクしてなおさらキモい

サンプル

<ItemsControl VirtualizingPanel.IsVirtualizing="True"
              VirtualizingPanel.VirtualizationMode="Recycling"
              VirtualizingPanel.ScrollUnit="Pixel">
    <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer PanningMode="Both"
                          VerticalScrollBarVisibility="Auto"
                          HorizontalScrollBarVisibility="Auto"
                          CanContentScroll="True">
                <ItemsPresenter />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
5月 142015
 

結論

グループ化したい時はControlTemplateItemsPresenterを使わないとダメっぽい

やりたかったこととか

また、ItemsPanel を指定せず、前述の ControlTemplate でコレクション項目の並べ方を指定する方法もあります。ControlTemplate 内に ItemsPresenter を配置する代わりに、Panel の派生クラスを指定し、IsItemsHost プロパティに True を設定します。

のだけども、グループ化して表示したい場合うまく表示されない。

  • こうしたかった
  • が、こうなる

※実際やりたかったこととは違うけど例なので……

Continue reading »