wpf - HierarchicalDataTemplate、VirtualizingStackPanel、窗口调整大小(最大化)
我在使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
编辑:
我认为 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