2012-03-13 15 views
6

Ecco il codice del mio ItemsControl che ingrandisce gli elementi quando il mouse si sposta.
Non riesco ad aumentare lo ZIndex dell'attuale oggetto ingrandito per metterlo sopra gli altri.Modifica ZIndex di un oggetto in un ItemsControl

<ItemsControl ItemsSource="{Binding Path=Value}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=Name}" 
         RenderTransformOrigin="0.5 0.5"> 
       <TextBlock.Style> 
        <Style TargetType="{x:Type TextBlock}"> 
         <Style.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="RenderTransform"> 
            <Setter.Value> 
             <ScaleTransform ScaleX="1.5" 
                 ScaleY="1.5" /> 
            </Setter.Value> 
           </Setter> 
          </Trigger> 
         </Style.Triggers> 
        </Style> 
       </TextBlock.Style> 
      </TextBlock> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

ho cercato di cambiare direttamente lo ZIndex nel trigger, ma non funziona.
Sembra che sia necessario modificare ZIndex in ContentPresenter che è il padre di TextBlock nel VisualTree e non direttamente in TextBlock.

<Setter Property="Panel.ZIndex" Value="99" /> 

Così ho provato a cambiare lo ZIndex nel ContentPresenter, ma ancora non funziona

<ItemsControl.ItemContainerStyle> 
    <Style TargetType="{x:Type ContentPresenter}"> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Panel.ZIndex" Value="99" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ItemsControl.ItemContainerStyle> 

Qualcuno sa come funziona?

+0

Funziona bene per me, utilizzando una tela. Quindi hai ragionevolmente un altro problema. Che tipo di pannello usi? – dowhilefor

+0

Uso un WrapPanel. Quale soluzione funziona per te? – Nicolas

risposta

10

Ho appena provato esattamente quello che hai suggerito in WPF 4 e ha funzionato bene.

MainWindow.xaml:

<Window x:Class="SO9687674.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"> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}"> 
       <TextBlock.Style> 
        <Style TargetType="{x:Type TextBlock}"> 
         <Style.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="RenderTransform"> 
            <Setter.Value> 
             <ScaleTransform ScaleX="2.5" 
                 ScaleY="2.5" /> 
            </Setter.Value> 
           </Setter> 
          </Trigger> 
         </Style.Triggers> 
        </Style> 
       </TextBlock.Style> 
       </TextBlock> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemContainerStyle> 
      <Style TargetType="{x:Type ContentPresenter}"> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Panel.ZIndex" Value="99" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </ItemsControl.ItemContainerStyle> 
    </ItemsControl> 
</Window> 

MainWindow.xaml.cs:

using System.Collections.Generic; 
using System.Windows; 

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

      this.DataContext = new List<string> 
      { 
       "One", 
       "two", 
       "three" 
      }; 
     } 
    } 
} 

Cosa ti fa pensare che non funziona? Hai usato Snoop per verificare?

+0

Penso che non funzioni perché non lo vedo :) Lo spio e lo ZIndex non cambia quando il mio mouse va avanti. Proverò il tuo esempio in un nuovo progetto. – Nicolas

+0

@Nicolas: a rischio di paternalismo, stai spiando il * container *, non il 'TextBlock' stesso, giusto? –

+0

@Nicolas l'unico modo che potrebbe non funzionare è se si ha qualcos'altro che scrive la proprietà Zindex. Controlla la [valore precedente] (http://msdn.microsoft.com/en-us/library/ms743230.aspx#listing), se qualcosa con una precedenza più alta sta scrivendo lo zindex, il valore di trigger è "ignorato", non veramente ignorato ma non usato finché una precedenza più alta scrive il valore. – dowhilefor