2010-09-28 93 views
1

我遇到了使用HierarchicalDataTemplate和VirtualizingStackPanel結合使用的wpf樹視圖的問題。使用下面提供的代碼,我運行應用程序並展開所有的treeviewitems。wpf - HierarchicalDataTemplate,VirtualizingStackPanel,窗口調整大小(最大化)

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

我再做出視「小」,這樣的項目都被虛擬化。我滾動到底部並選擇最後一個項目。

(遺憾沒有足夠的代表發佈多個鏈接...笑)

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

然後我將窗口最大化:

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

看來,在(但不限於)最大化,而不是被實現所有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> 

主窗口.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 
    } 
} 

回答

0

編輯:

我認爲CanContentScroll是問題,但事實證明,如果我把它設置爲false,那麼項目沒有虛擬化。

嘆息