wpf - HierarchicalDataTemplate、VirtualizingStackPanel、窗口调整大小(最大化)

发布于 2024-09-25 10:53:24 字数 7370 浏览 3 评论 0原文

我在使用 HierarchicalDataTemplate 和 VirtualizingStackPanel 的 wpf 树视图时遇到问题。使用下面提供的代码,我运行应用程序并展开所有树视图项目。

http://img227.imageshack.us/img227/3536/wpftv03.png

然后我将视口设置为“小”,以便项目被虚拟化。我滚动到底部并选择最后一项。

(抱歉,没有足够的代表来发布多个链接...哈哈)

http://img291.imageshack.us/img291/9020/wpftv01.png

然后我最大化窗口:

http://img706.imageshack.us/img706 /607/wpftv02.png

似乎在(但不限于)Maximize 上,并不是所有的treeviewitems 都被实现了。我很困惑可能是什么问题。任何帮助将不胜感激! :D

(在 win7 中,当您“停靠”应用程序以填充一半屏幕时,也会发生这种情况)

App.xaml

<Application x:Class="WpfApplication4.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication4"
             StartupUri="MainWindow.xaml">
    <Application.Resources>

        <HierarchicalDataTemplate 
            DataType="{x:Type local:Alpha}" 
            ItemsSource="{Binding Items}">
            <Border Width="50" Height="10" Background="Red">

            </Border>
        </HierarchicalDataTemplate>

        <Style x:Key="TreeViewStyle">
            <Setter Property="TreeView.Background" Value="Transparent"/>
            <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
            <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
            <Setter Property="TreeView.SnapsToDevicePixels" Value="True" />
            <Setter Property="TreeView.OverridesDefaultStyle" Value="True" />
            <Setter Property="ItemsControl.ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel IsItemsHost="True"/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="TreeView.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TreeView">
                        <ScrollViewer Focusable="False" CanContentScroll="True" Padding="4">
                            <ItemsPresenter HorizontalAlignment="Stretch"/>
                        </ScrollViewer>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Application.Resources>
</Application>

MainWindow.xaml

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView 
            x:Name="tv"
     Style="{DynamicResource TreeViewStyle}"
            ItemsSource="{Binding Items}"/>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private ObservableCollection<Alpha> _Items;
        public ObservableCollection<Alpha> Items
        {
            get
            {
                return(_Items);
            }
            set
            {
                _Items = value;
                OnPropertyChanged("Items");
            }
        }

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;

            Items = new ObservableCollection<Alpha>();

            Alpha a = new Alpha(null);

            Alpha a0 = new Alpha(a);
            Alpha a1 = new Alpha(a);
            Alpha a2 = new Alpha(a);
            Alpha a3 = new Alpha(a);
            Alpha a4 = new Alpha(a);
            Alpha a5 = new Alpha(a);
            Alpha a6 = new Alpha(a);
            Alpha a7 = new Alpha(a);
            Alpha a8 = new Alpha(a);
            Alpha a9 = new Alpha(a);

            Alpha b = new Alpha(null);

            Alpha b0 = new Alpha(b);
            Alpha b1 = new Alpha(b);
            Alpha b2 = new Alpha(b);
            Alpha b3 = new Alpha(b);
            Alpha b4 = new Alpha(b);
            Alpha b5 = new Alpha(b);
            Alpha b6 = new Alpha(b);
            Alpha b7 = new Alpha(b);
            Alpha b8 = new Alpha(b);
            Alpha b9 = new Alpha(b);


            a.Items.Add(a0);
            a.Items.Add(a1);
            a.Items.Add(a2);
            a.Items.Add(a3);
            a.Items.Add(a4);
            a.Items.Add(a5);
            a.Items.Add(a6);
            a.Items.Add(a7);
            a.Items.Add(a8);
            a.Items.Add(a9);

            b.Items.Add(b0);
            b.Items.Add(b1);
            b.Items.Add(b2);
            b.Items.Add(b3);
            b.Items.Add(b4);
            b.Items.Add(b5);
            b.Items.Add(b6);
            b.Items.Add(b7);
            b.Items.Add(b8);
            b.Items.Add(b9);

            Items.Add(a);
            Items.Add(b);


        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion // INotifyPropertyChanged Members
}

    public class Alpha: INotifyPropertyChanged
    {
        private Alpha()
            : base()
        {
            Items = new ObservableCollection<Alpha>();
        }

        public Alpha(Alpha parent) : this()
        {
            Parent = parent;
        }

        private string _Description;
        public string Description
        {
            get
            {
                return (_Description);
            }
            set
            {
                _Description = value;
                OnPropertyChanged("Description");
            }
        }

        private ObservableCollection<Alpha> _Items;
        public ObservableCollection<Alpha> Items
        {
            get
            {
                return (_Items);
            }
            set
            {
                _Items = value;
                OnPropertyChanged("Items");
            }
        }

        private Alpha _Parent;
        public Alpha Parent
        {
            get
            {
                return (_Parent);
            }
            set
            {
                _Parent = value;
                OnPropertyChanged("Parent");
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion // INotifyPropertyChanged Members
    }
}

I am having a problem with a wpf treeview that uses a HierarchicalDataTemplate in conjunction with a VirtualizingStackPanel. Using the code provided below, I run the application and expand all the treeviewitems.

http://img227.imageshack.us/img227/3536/wpftv03.png

I then make the viewport "small" so that items are virtualized. I scroll to the bottom and select the last item.

(sorry not enough rep to post more than one link...lol)

http:// img291.imageshack.us/img291/9020/wpftv01.png

I then maximize the window :

http:// img706.imageshack.us/img706/607/wpftv02.png

It seems that on (but not limited to) Maximize, not all the treeviewitems are being realized. I am stumped what the problem could be. Any help would be appreciated! :D

(this also happens in win7 when you "dock" the app to fill half the screen)

App.xaml

<Application x:Class="WpfApplication4.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication4"
             StartupUri="MainWindow.xaml">
    <Application.Resources>

        <HierarchicalDataTemplate 
            DataType="{x:Type local:Alpha}" 
            ItemsSource="{Binding Items}">
            <Border Width="50" Height="10" Background="Red">

            </Border>
        </HierarchicalDataTemplate>

        <Style x:Key="TreeViewStyle">
            <Setter Property="TreeView.Background" Value="Transparent"/>
            <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
            <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
            <Setter Property="TreeView.SnapsToDevicePixels" Value="True" />
            <Setter Property="TreeView.OverridesDefaultStyle" Value="True" />
            <Setter Property="ItemsControl.ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel IsItemsHost="True"/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="TreeView.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TreeView">
                        <ScrollViewer Focusable="False" CanContentScroll="True" Padding="4">
                            <ItemsPresenter HorizontalAlignment="Stretch"/>
                        </ScrollViewer>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Application.Resources>
</Application>

MainWindow.xaml

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView 
            x:Name="tv"
     Style="{DynamicResource TreeViewStyle}"
            ItemsSource="{Binding Items}"/>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private ObservableCollection<Alpha> _Items;
        public ObservableCollection<Alpha> Items
        {
            get
            {
                return(_Items);
            }
            set
            {
                _Items = value;
                OnPropertyChanged("Items");
            }
        }

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;

            Items = new ObservableCollection<Alpha>();

            Alpha a = new Alpha(null);

            Alpha a0 = new Alpha(a);
            Alpha a1 = new Alpha(a);
            Alpha a2 = new Alpha(a);
            Alpha a3 = new Alpha(a);
            Alpha a4 = new Alpha(a);
            Alpha a5 = new Alpha(a);
            Alpha a6 = new Alpha(a);
            Alpha a7 = new Alpha(a);
            Alpha a8 = new Alpha(a);
            Alpha a9 = new Alpha(a);

            Alpha b = new Alpha(null);

            Alpha b0 = new Alpha(b);
            Alpha b1 = new Alpha(b);
            Alpha b2 = new Alpha(b);
            Alpha b3 = new Alpha(b);
            Alpha b4 = new Alpha(b);
            Alpha b5 = new Alpha(b);
            Alpha b6 = new Alpha(b);
            Alpha b7 = new Alpha(b);
            Alpha b8 = new Alpha(b);
            Alpha b9 = new Alpha(b);


            a.Items.Add(a0);
            a.Items.Add(a1);
            a.Items.Add(a2);
            a.Items.Add(a3);
            a.Items.Add(a4);
            a.Items.Add(a5);
            a.Items.Add(a6);
            a.Items.Add(a7);
            a.Items.Add(a8);
            a.Items.Add(a9);

            b.Items.Add(b0);
            b.Items.Add(b1);
            b.Items.Add(b2);
            b.Items.Add(b3);
            b.Items.Add(b4);
            b.Items.Add(b5);
            b.Items.Add(b6);
            b.Items.Add(b7);
            b.Items.Add(b8);
            b.Items.Add(b9);

            Items.Add(a);
            Items.Add(b);


        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion // INotifyPropertyChanged Members
}

    public class Alpha: INotifyPropertyChanged
    {
        private Alpha()
            : base()
        {
            Items = new ObservableCollection<Alpha>();
        }

        public Alpha(Alpha parent) : this()
        {
            Parent = parent;
        }

        private string _Description;
        public string Description
        {
            get
            {
                return (_Description);
            }
            set
            {
                _Description = value;
                OnPropertyChanged("Description");
            }
        }

        private ObservableCollection<Alpha> _Items;
        public ObservableCollection<Alpha> Items
        {
            get
            {
                return (_Items);
            }
            set
            {
                _Items = value;
                OnPropertyChanged("Items");
            }
        }

        private Alpha _Parent;
        public Alpha Parent
        {
            get
            {
                return (_Parent);
            }
            set
            {
                _Parent = value;
                OnPropertyChanged("Parent");
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion // INotifyPropertyChanged Members
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如日中天 2024-10-02 10:53:24

编辑:

我认为 CanContentScroll 是问题所在,但事实证明,如果我将其设置为 false,则项目不会虚拟化。

叹息

Edit :

I thought CanContentScroll was the problem, but it turns out if i set this to false, then items are not virtualized.

sigh

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文