<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属性,但总是高于最后添加的项目。
任何想法?
答案 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设置为合理的简单对象而言,这不是问题,但可能不是足够复杂的对象)。在讲述者中收听您的应用,看看它听起来如何。