5

ItemsPanelTemplateとしてグリッドを持つItemsControlがあります

<ItemsControl ItemsSource="{Binding CellCollection}" Name="CellGrid">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid Name="grid" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

コードビハインドでこのItemControlを使用してUserControlを作成し、次にRowDefinitionsとColumnDefinitonsを作成する必要があります。私はこのメソッドを使用して「グリッド」を取得します。

private TChildItem FindVisualChild<TChildItem>(DependencyObject obj) where TChildItem : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            var child = VisualTreeHelper.GetChild(obj, i);

            if (child != null && child is TChildItem)
                return (TChildItem)child;

            var childOfChild = FindVisualChild<TChildItem>(child);

            if (childOfChild != null)
                return childOfChild;
        }

        return null;
    }

しかし、UserControlを表示する前にこのメソッドを呼び出すと、nullが返されるため、アクセス「グリッド」が見つからず、UserControlが表示されたときに、期待どおりに表示されませんでした。

私はグーグルしようとしましたが、私が見つけたのは、フォームに表示されるまでVisualTreeがItemControl用に構築されていないという仮定だけです。

助言がありますか?悪い英語をありがとうそして申し訳ありません;)

4

1 に答える 1

10

ApplyTemplateを呼び出すと、テンプレートを適用してビジュアルツリーを構築するように要素に指示できます。

ただし、これはテンプレートを完全に適用するわけではありません。この場合、最初ApplyTemplate()にItemsControlを呼び出しvar item_presenter = FindVisualChild<ItemsPresenter>(items_control)、次にを呼び出すitem_presenter.ApplyTemplate()必要があります。これで、グリッドをVisualTreeに強制的に追加できます。

于 2012-05-26T19:22:39.850 に答える