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>

当我运行代码时,我遇到了两个我不明白的问题:

  1. 当我期望每个项目都有一个 ScrollViewer 时,我似乎只得到一个 ScrollViewer。因此,如果我添加两个选项卡项并使画布大小不同,则滚动条仅调整为最大画布的大小。我希望 Shared=False 属性会为每个选项卡创建模板的新实例。
  2. 可能与第 1 项有关 - 如果我在 MyDesignCanvas 的构造函数上放置一个断点,它会在添加第一个选项卡时被命中,但在添加其他选项卡时不会命中。只有当我开始关闭选项卡时,断点才会再次被击中 - 我希望每个选项卡添加都会被击中。

我想我对数据模板的理解还不够,所以任何人都可以解释可能发生的事情或指出一些可以帮助我诊断的资源吗?

谢谢

4

1 回答 1

3

我已经意识到问题出在哪里——WPF TabControl 对选项卡内容进行了内部虚拟化,因此尽管我使用了 Shared=False,但我一直在重新使用选项卡内容并只是更改数据上下文。有关更多详细信息,请参阅此 SO 问题问题。

于 2012-09-26T09:26:03.537 回答