6

ItemsControl ItemsPanelTemplate で定義された Grid があり、RowDefinitions の 1 つに ax:Name が定義されています (したがって、行サイズをアニメーション化できます)。

<ItemsControl ItemsSource="{Binding Data, Source={StaticResource model}}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition x:Name="t" />
                    <RowDefinition />
                </Grid.RowDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

これは 3.5 では問題なく機能していましたが、最近 4.0 にアップグレードしたとき、すべてがバラバラになりました。私が見るのは、定義された行と列の定義を持つグリッドですが、子はありません。

グリッドで IsItemsHost=true を設定すると、すべてが機能し始めます。x:Name をグリッド自体に追加するか、RowDefinition から x:Name を削除すると、すべて機能します。

<ItemsPanelTemplate>
    <Grid IsItemsHost="True">
        <Grid.RowDefinitions>
            <RowDefinition x:Name="t" />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</ItemsPanelTemplate>

また

<ItemsPanelTemplate>
    <Grid x:Name="g">
        <Grid.RowDefinitions>
            <RowDefinition x:Name="t" />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</ItemsPanelTemplate>

これはバグのようですが、コミュニティに確認して、人々が同意しているかどうか、または何か見落としがないかどうかを確認したかったのです。Connect や Web で何も見つからなかったので、私が見ているものを誰か説明してもらえますか?

4

1 に答える 1

0

これはバグではないと思います。ここで行ったことは、設計時またはコンパイル時ではなく実行時に例外をスローしないバグをコードに誤って導入したため、アニメーションが完了せず、グリッドのコンテンツがレンダリングされませんでした。

競合は、このMSDNの記事で説明されているように特定のWPFXAMLネームスコープにあります。この記事では、名前の競合を防ぐために、テンプレート内の名前付き要素に自動的に一意の要素が与えられると述べていますが、テンプレートルートに名前がなく、名前付きの子が含まれている場合にどうなるか、またはにどのように影響するかについては説明していません。DataTemplateNamescopeIsItemsHostItemsTemplate

  1. 私が提案できるアプローチの1つは、元のシナリオを使用し、デバッグ中に、アニメーションに関連するXAMLパーサーによって静かに弱体化されたランタイム例外がないか出力ログを監視することです。

  2. 別の(個人的には、より良い)アプローチは、から継承する新しい「テンプレート化されたコントロール」を作成することItemsControlです。ここでは、オーバーロードItemsPanel中ににアクセスして/を見つけ、そこでアニメーションを実行できます。これが良いチュートリアルです。ApplyTemplateGridGridColumn

于 2011-11-28T23:28:20.100 に答える