【问题标题】:VirtualizingPanel stops ScrollViewer working within ViewboxVirtualizingPanel 停止在 Viewbox 中工作的 ScrollViewer
【发布时间】:2018-10-18 16:43:53
【问题描述】:

我有一个简单的自定义面板,托管在 ItemsPanelItemsControl 中。 ItemsControlTemplate 更新为用 ViewboxScrollViewer 围绕 ItemsPresenter。这是 XAML 代码:

<ItemsControl ItemsSource="{Binding Buttons, RelativeSource={RelativeSource 
    AncestorType={x:Type Local:MainWindow}}}" 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    ScrollViewer.VerticalScrollBarVisibility="Visible" 
    ScrollViewer.CanContentScroll="True">
    <ItemsControl.Template>
        <ControlTemplate TargetType="{x:Type ItemsControl}">
            <ScrollViewer CanContentScroll="True">
                <Viewbox Stretch="UniformToFill">
                    <ItemsPresenter />
                </Viewbox>
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Local:TestPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Height="250" Width="250" HorizontalAlignment="Center" 
                Content="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

还有Panel

public class TestPanel : Panel
{
    protected override Size MeasureOverride(Size availableSize)
    {
        var desiredSize = new Size();
        var layoutSlotSize = availableSize;

        layoutSlotSize.Height = double.PositiveInfinity;
        for (int i = 0, count = InternalChildren.Count; i < count; ++i)
        {
            UIElement child = InternalChildren[i];
            if (child == null) continue;
            child.Measure(layoutSlotSize);
            var childDesiredSize = child.DesiredSize;
            desiredSize.Width = Math.Max(desiredSize.Width, childDesiredSize.Width);
            desiredSize.Height += childDesiredSize.Height;
        }
        return desiredSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        double verticalOffset = 0;
        for (int i = 0, count = InternalChildren.Count; i < count; ++i)
        {
            UIElement child = InternalChildren[i];
            if (child == null) continue;
            child.Arrange(new Rect(0, verticalOffset, child.DesiredSize.Width, 
                child.DesiredSize.Height));
            verticalOffset += child.DesiredSize.Height;
        }
        return base.ArrangeOverride(finalSize);
    }
}

最后,MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Buttons = new ObservableCollection<string>();
        IEnumerable<int> characterCodes = Enumerable.Range(65, 26);
        foreach (int characterCode in characterCodes) 
            Buttons.Add(((char)characterCode).ToString().ToUpper());
    }

    public static readonly DependencyProperty ButtonsProperty = 
        DependencyProperty.Register(nameof(Buttons), typeof(ObservableCollection<string>), 
        typeof(MainWindow), null);

    public ObservableCollection<string> Buttons
    {
        get { return (ObservableCollection<string>)GetValue(ButtonsProperty); }
        set { SetValue(ButtonsProperty, value); }
    }
}

这一切都按预期工作......到目前为止,一切都很好。问题是当我将基类从Panel 更改为VirtualizingPanel 时,我需要这样做来虚拟化数据(不是这个示例按钮数据)。更改基类后,面板立即停止工作。我完全知道如何在面板中虚拟化数据......我有一个工作示例。我的问题是当我想在ScrollViewer 中添加一个Viewbox

请注意,此 XAML 可以与普通的 PanelStackPanel 一起正常工作,但是一旦我将其更改为 VirtualizingPanel,它就会停止工作(什么都不会呈现,并且 InternalChildren 属性包含没有元素)。谁能帮我解释一下这个问题?

【问题讨论】:

    标签: wpf panel virtualization scrollviewer viewbox


    【解决方案1】:

    我仍然不知道为什么VirtualizingPanelScrollViewer 中的ViewBox 中不起作用,但我发现如果我在面板中扩展VirtualizingStackPanel 类,一切都会按预期工作。

    因此,对于那些需要堆叠虚拟化项目的解决方案是扩展VirtualizingStackPanel 类。对于那些需要其他类型的孩子安排的人,我很抱歉,但我没有答案,除非你删除Viewbox

    我仍然非常乐意收到有关此主题的任何进一步信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 2012-08-18
      • 2018-08-16
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多