0

理解できない WPF の問題があります - 誰でも助けてもらえますか?

以下の WPF は、標準の TabControl の ContentTemplate として使用され、ResourceDictionary 内に存在します。MyElementItemsControl は ItemsControl の単純な派生物であり、MyDesignCanvas は Canvas の単純な派生物です。

    <DataTemplate x:Key="TabContent"  x:Shared="False">
    <Grid>
        <Grid Grid.RowSpan="2">
            <ScrollViewer x:Name="contentScrollViewer" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" >
                <Grid>
                    <View:MyElementItemsControl BorderBrush="Transparent" x:Name="schedulePanel" ItemsSource="{Binding Path=Elements}" Background="White">
                        <View:MyElementItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <View:MyDesignCanvas Height="1000" Width="1000" HorizontalAlignment="Left" VerticalAlignment="Top" 
                                                                     SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                                                                     Background="Transparent">
                                </View:MyDesignCanvas>
                            </ItemsPanelTemplate>
                        </View:MyElementItemsControl.ItemsPanel>
                    </View:MyElementItemsControl>

                    <Grid.LayoutTransform>
                        <TransformGroup>
                            <ScaleTransform>
                                <ScaleTransform.ScaleX>
                                    <Binding ElementName="SlideZoom" Path="Value" Mode="OneWay"/>
                                </ScaleTransform.ScaleX>
                                <ScaleTransform.ScaleY>
                                    <Binding ElementName="SlideZoom" Path="Value" Mode="OneWay"/>
                                </ScaleTransform.ScaleY>
                            </ScaleTransform>
                        </TransformGroup>
                    </Grid.LayoutTransform>

                </Grid>
            </ScrollViewer>

        </Grid>

        <Slider Opacity="0.5" VerticalAlignment="Top" HorizontalAlignment="Left" Width="300" Grid.Row="1" Name="SlideZoom" Orientation="Horizontal" Minimum="0.1" Maximum="3" Value="1">
        </Slider>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>

    </Grid>
</DataTemplate>

コードを実行すると、理解できない 2 つの問題が発生します。

  1. アイテムごとに ScrollViewer が期待される場合、単一の ScrollViewer しか取得できないようです。したがって、2 つのタブ項目を追加してキャンバスを異なるサイズにすると、スクロール バーは最大のキャンバスのサイズのみに調整されます。Shared=False 属性によって、タブごとにテンプレートの新しいインスタンスが作成されると予想していました。
  2. おそらく項目1に関連しています- MyDesignCanvas のコンストラクターにブレークポイントを設定すると、最初のタブが追加されたときにヒットしますが、他のタブが追加されたときにはヒットしません。タブを閉じ始めたときにのみ、ブレークポイントが再びヒットします。タブを追加するたびにヒットすると予想されます。

私はデータ テンプレートを十分に理解していないと思うので、誰かが何が起こっているのか説明したり、これを診断するのに役立つリソースを教えてくれませんか?

ありがとう

4

1 に答える 1

3

問題が何であるかを認識しました-WPF TabControlはタブコンテンツの内部仮想化を行うため、Shared = Falseを使用しているにもかかわらず、タブコンテンツを再利用し、データコンテキストを変更するだけです。詳細については、この SO の質問これも参照してください。

于 2012-09-26T09:26:03.537 に答える