2012-03-13 20 views
6

Aquí está el código de mis ItemsControl que hace un acercamiento a los elementos cuando el mouse pasa.
No logro aumentar el ZIndex del elemento ampliado actual para colocarlo sobre los demás.Modificar ZIndex de un Items en 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> 

Intenté cambiar directamente el ZIndex en el disparador, pero no funciona.
Parece que necesito cambiar el ZIndex en el ContentPresenter que es el padre del TextBlock en el VisualTree y no directamente en el TextBlock.

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

así que traté de cambiar el ZIndex en el ContentPresenter, pero aún no funciona

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

¿Alguien sabe cómo funciona?

+0

Funciona bien para mí, utilizando un lienzo. Entonces, de manera propagable tienes otro problema. ¿Qué tipo de panel usas? – dowhilefor

+0

Uso un WrapPanel. ¿Qué solución funciona para ti? – Nicolas

Respuesta

10

Acabo de probar exactamente lo que sugeriste en WPF 4 y funcionó bien.

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

qué te hace pensar que no está funcionando? ¿Has usado Snoop para verificar?

+0

Creo que no funciona porque veo que no :) Lo fisgoneo y el ZIndex no cambia cuando mi mouse se enciende. Probaré tu ejemplo en un proyecto nuevo. – Nicolas

+0

@Nicolas: a riesgo de condescendencia, usted está fisgoneando el * contenedor *, no el 'TextBlock' en sí, ¿verdad? –

+0

@Nicolas, la única forma que podría no funcionar es si tiene algo más que escriba la propiedad Zindex. Compruebe el [valor de precedencia] (http://msdn.microsoft.com/en-us/library/ms743230.aspx#listing), si algo con una precedencia más alta está escribiendo el zindex, el valor del desencadenante es "ignorado", no realmente ignorado pero no usado siempre que una precedencia más alta escriba el valor. – dowhilefor

Cuestiones relacionadas