Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Grid.ItemsControl中设置每个项的z索引_C#_Microsoft Metro_Itemscontrol - Fatal编程技术网

C# 在Grid.ItemsControl中设置每个项的z索引

C# 在Grid.ItemsControl中设置每个项的z索引,c#,microsoft-metro,itemscontrol,C#,Microsoft Metro,Itemscontrol,我试图在我的每个模型中设置z索引,但失败了 如上所述定义一个datatemplate,我已经设置了Z-index属性,但总是出现在最后添加的项之上 有什么想法吗?Canvas.ZIndex和类似的附加属性会影响元素在其父画布中的位置,但在您的情况下,画布不是项目的父画布。画布和模板的根UserElement uc:ImageControl等之间有一个ContentPresenter 我们无法直接从Xaml设置ContentPresenter的属性。我们需要深入到代码背后,并将ItemsContr

我试图在我的每个模型中设置z索引,但失败了

如上所述定义一个datatemplate,我已经设置了Z-index属性,但总是出现在最后添加的项之上


有什么想法吗?

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

我们无法直接从Xaml设置ContentPresenter的属性。我们需要深入到代码背后,并将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>
此代码段设置了从容器的Canvas.ZIndex属性到数据对象的ZIndex属性的绑定,但您可以将ZIndex指向其他位置,也可以根据需要直接进行设置


它还将AutomationProperties绑定到数据对象上的属性,这样应用程序就不会默认调用对象的ToString。对于可以将ToString设置为合理值但对于复杂对象可能不够好的简单对象来说,这不是个问题。在“讲述人”中收听应用程序的声音。

您确定这些项目不会相互重叠吗?
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") });
    }
}