在Grid.ItemsControl中设置每个项目的z-index

时间:2014-11-16 12:57:26

标签: c# microsoft-metro itemscontrol

    <DataTemplate x:Key="DataTemplateMusicControl">
        <uc:MusicControl Canvas.ZIndex="2" Style="{StaticResource ModelStyle}"></uc:MusicControl>
    </DataTemplate>
    <DataTemplate x:Key="DataTemplateImageControl">
        <uc:ImageControl Canvas.ZIndex="2"></uc:ImageControl>
    </DataTemplate>
    <DataTemplate x:Key="DataTemplateLoginControl">
        <uc:LoginControl Canvas.ZIndex="1"></uc:LoginControl>
    </DataTemplate>
    <DataTemplate x:Key="DataTemplateTextControl">
        <uc:TextEditControl> </uc:TextEditControl>
    </DataTemplate>
    <local:ModelDataTemplateSelector x:Name="MyTemplateSelector" 
                                     DataTemplateMusicControl="{StaticResource DataTemplateMusicControl  }" 
                                     DataTemplateImageControl="{StaticResource DataTemplateImageControl}"
                                     DataTemplateLoginControl="{StaticResource DataTemplateLoginControl}"/>

    <ItemsControl ItemsSource="{Binding GridItemList}"
                ItemTemplateSelector="{StaticResource MyTemplateSelector}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate >
                <Canvas Name="MainCanvas" Background="#FFB85252"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

我试图在每个模型中设置z-index,但失败了。

如上所述定义一个datatemplate,我已经设置了Z-index属性,但总是高于最后添加的项目。

任何想法?

1 个答案:

答案 0 :(得分:0)

Canvas.ZIndex和类似的附加属性会影响元素在其父Canvas中的位置,但在您的情况下,Canvas不是项目的父级。 Canvas和模板的根UserElement(uc:ImageControl等)之间有一个ContentPresenter。

我们无法直接从Xaml设置ContentPresenter的属性。我们需要考虑代码隐藏和子类ItemsControl,以便我们可以在创建容器时覆盖容器:

class ZIndexItemsControl : ItemsControl
{
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);
        FrameworkElement source = element as FrameworkElement;
        source.SetBinding(Canvas.ZIndexProperty, new Binding { Path = new PropertyPath("ZIndex") });
        // source.SetValue(Canvas.ZIndexProperty, 2);
        source.SetBinding(AutomationProperties.AutomationIdProperty, new Binding { Path = new PropertyPath("AutomationId") });
        source.SetBinding(AutomationProperties.NameProperty, new Binding { Path = new PropertyPath("AutomationName") });
    }
}

此代码段设置从容器的Canvas.ZIndexProperty到数据对象的ZIndex属性的绑定,但您可以将ZIndex指向其他位置或直接根据需要进行设置。

它还将AutomationProperties绑定到数据对象上的属性,因此应用程序不会默认调用对象的ToString(对于可以将ToString设置为合理的简单对象而言,这不是问题,但可能不是足够复杂的对象)。在讲述者中收听您的应用,看看它听起来如何。