C# 在Grid.ItemsControl中设置每个项的z索引
我试图在我的每个模型中设置z索引,但失败了 如上所述定义一个datatemplate,我已经设置了Z-index属性,但总是出现在最后添加的项之上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
有什么想法吗?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") });
}
}