Проблемы создания экземпляра TabControl DataTemplate

У меня есть проблема с WPF, которую я не понимаю - кто-нибудь может помочь?

WPF ниже используется в качестве ContentTemplate для стандартного TabControl и находится в 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>

Когда я запускаю код, у меня возникают две проблемы, которые я не понимаю:

  1. Кажется, я получаю только один ScrollViewer, когда я ожидаю ScrollViewer для каждого элемента. Поэтому, если я добавлю два элемента вкладки и сделаю холст разных размеров, полосы прокрутки будут настроены только на размер самого большого холста. Я ожидал, что атрибут Shared=False создаст новые экземпляры шаблона для каждой вкладки.
  2. Может быть, связано с пунктом 1 - если я добавлю точку останова на конструктор MyDesignCanvas, он получит удар при добавлении первой вкладки, но не при добавлении других вкладок. Только когда я начинаю закрывать вкладки, точка останова снова попадает в цель - я ожидаю попадания в каждое добавление вкладки.

Думаю, я не совсем понимаю шаблоны данных, поэтому кто-нибудь может объяснить, что может происходить, или указать мне на некоторые ресурсы, которые могут помочь мне диагностировать это?

Спасибо

1 ответ

Решение

Я понял, в чем проблема - WPF TabControl выполняет внутреннюю виртуализацию содержимого вкладок, поэтому повторно использует содержимое вкладок и просто изменяет контекст данных, несмотря на то, что я использую Shared=False. Смотрите этот ТАК вопрос и этот тоже для более подробной информации.

Другие вопросы по тегам