2010-09-28 11 views
1

J'ai un problème avec une arborescence wpf qui utilise un HierarchicalDataTemplate en conjonction avec un VirtualizingStackPanel. En utilisant le code fourni ci-dessous, je lance l'application et développe tous les treeviewitems.wpf - HierarchicalDataTemplate, VirtualizingStackPanel, Redimensionner la fenêtre (agrandir)

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

je puis faire la fenêtre « petit » afin que les articles sont virtualisés. Je défile vers le bas et sélectionne le dernier élément.

(désolé représentant ne suffit pas d'afficher plus d'un lien ... lol)

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

Je puis la fenêtre maximiser :

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

Il semble que le (mais sans s'y limiter) Maximize, tous les treeviewitems sont en cours de réalisation. Je suis perplexe ce que le problème pourrait être. Toute aide serait appréciée! : D

(cela arrive aussi dans win7 lorsque vous "dock" l'application pour remplir la moitié de l'écran)

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 
    } 
} 

Répondre

0

Editer:

Je pensais que CanContentScroll était le problème, mais il s'avère que si je l'ai mis à false, alors les éléments ne sont pas virtualisés.

sigh

Questions connexes