- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题有很多不同的答案,但还没有找到一个适用于 Windows Phone 的问题。
所以这里是:
我有一个显示用户控件的项目控件。
我像这样将 ObservableCollection 绑定(bind)到此 ItemsControl:
<Canvas Name="CanvasGrid" Grid.Column="1" Background="Transparent" Canvas.ZIndex="5">
<ItemsControl ItemsSource="{Binding InGame}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Canvas>
<View:SInGame/>
</Canvas>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Canvas>
当在 Itemscontrol 中添加一个元素时,该元素会被赋予一个独立于我赋予元素的 zindex 以及显示的用户控件。我想要做的是有按钮,我可以在 z 方向上下移动所选元素。
查看 SInGame
为了从以下 View 正确绑定(bind)位置,需要 itemscontrol 中的 Canvas:
<UserControl x:Class="MVVMTestApp.View.SInGame"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP8"
xmlns:View="clr-namespace:MVVMTestApp.View"
mc:Ignorable="d"
Canvas.Left="{Binding pos.x}" Canvas.Top="{Binding pos.y}">
<Path >
<.....
....../>
</Path>
</UserControl>
然后可以争辩说, View 应该由具有位置绑定(bind)的 Canvas 组成。但这仍然会留下 zindex 的问题。
如评论中所述。 ItemsControl
看不到外部 Canvas ,因此无法使用 zindex 到达它。那么如何设置 zindex 呢?还是无法使用 ItemsControl
元素?
最佳答案
ItemsControl 获取每个项目,将其包装在容器 (ContentPresenter) 中,并将其添加到项目面板(默认情况下为 StackPanel)。因此,示意性地,您最终将得到这棵树:
<!-- the items panel (StackPanel by default) -->
<StackPanel>
<!-- the first item wrapper -->
<ContentPresenter>
<!-- your item template -->
<Canvas>
<View:SInGame/>
</Canvas>
</ContentPresenter>
<!-- more items ... -->
</StackPanel>
你会想做两件事:
ItemsControl.ItemsPanel
为项目提供一个共享的 Canvas 容器。ZIndex
已应用于 ContentPresenter
包装器。这两点会给你一个这样的模式,它应该允许你从前到后定位项目:
<!-- the items panel (change to a Canvas) -->
<Canvas>
<!-- the first item wrapper (need to set Canvas.ZIndex to position) -->
<ContentPresenter Canvas.ZIndex="1">
<!-- your item template -->
<Canvas>
<View:SInGame/>
</Canvas>
</ContentPresenter>
<!-- more items ... -->
</Canvas>
要实现第二点,我相信您需要子类化 ItemsControl
,并覆盖 PrepareContainerForItemOverride
。例如,以下修改每个项目容器,将其 ZIndex 属性绑定(bind)到项目本身的 ZIndex:
public class CanvasItemsControl : ItemsControl
{
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
var contentPresenter = (ContentPresenter)element;
var binding = new Binding("ZIndex") { Source = contentPresenter.Content };
contentPresenter.SetBinding(Canvas.ZIndexProperty, binding);
}
}
现在您只需将 View:SInGame
项上的 Canvas.ZIndex
绑定(bind)到基础模型属性(“pos.x”?)。
综合起来:
<local:CanvasItemsControl ItemsSource="{Binding InGame}">
<local:CanvasItemsControl.ItemTemplate>
<DataTemplate>
<Canvas Canvas.ZIndex="{Binding pos.x}" >
<View:SInGame />
</Canvas>
</DataTemplate>
</local:CanvasItemsControl.ItemTemplate>
<local:CanvasItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
<local:CanvasItemsControl.ItemsPanel>
</local:CanvasItemsControl>
这样,每个 SInGame
实例都有一个 Z-index,并且每个实例都应该相对于其他实例定位。您可以通过修改“InGame”中每个 View 模型项目的“MyZIndex”属性来前后重新定位项目。
编辑
有一个比上述方法更简单的替代方法,它可能适合您。这种方法会给你一个像这样的扁平树:
<!-- the items panel (change to a Canvas) -->
<Canvas>
<!-- the items -->
<View:SInGame/>
<View:SInGame/>
</Canvas>
为此,重写 GetContainerForItemOverride()
以返回 SInGame
对象:
public class CanvasItemsControl : ItemsControl
{
protected override DependencyObject GetContainerForItemOverride()
{
return new SInGame();
}
// Any setup of the `SInGame` items should be done here
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
var container = (SInGame)element;
}
}
这允许您在没有任何 ItemTemplate 的情况下定义 ItemsControl:
<local:CanvasItemsControl ItemsSource="{Binding InGame}">
<local:CanvasItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
<local:CanvasItemsControl.ItemsPanel>
</local:CanvasItemsControl>
关于c# - 更改 itemscontrol windows phone 中元素的 zindex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23150218/
我正在使用 M-V-VM 并在我的 ViewModel 上有一个名为“EntitySelectedCommand”的命令。 我试图让 ItemsControl 中的所有项目来触发这个命令,但是它不起作
在我的 View 中有一个 ItemsControl,它绑定(bind)到来自 ViewModel 的 ObservableCollection。集合被填充,然后引发从 VM 到 View 的事件(想
我最近遇到了一个虚拟化问题,我将其缩小到以下代码。 虚拟化在以下代码段中不起作用的原因是因为 child 没有特定的高度。所以我的猜测是它会永远扩展并且虚拟化会中断。 给 child 一个特定的高度解
我是 WPF 的新手。我一直在尝试执行以下操作: 以下是我的数据结构: public class TokenItems {public string items {get;set;} public i
我正在尝试从 WPF MVVM 教程中扩展应用程序作为练习。对于我在这里面临的这个特定问题,我在网上没有找到解决方案。 我有一个名为“StudentsToAdd”的带有 ObservableColle
我正在使用带有 MVVM 模式的 Wpf,所以在 Xamel 中,我有一个 itemControl 持有另一个 itemcontrol,每个 itemcontrol 绑定(bind)来自不同的 Obs
标题可能听起来令人费解,但请耐心等待。 我有包含住户的房间: public class Room { public string Name { get; set; } public L
我需要能够从子 ItemsControll 数据模板内部绑定(bind)到父 ItemsControl 的属性:
这让我发疯。也许我的数据设计有误,但我正在尝试从父 ItemsControl 绑定(bind)到事件项目。 每个区域都有一种颜色,以便在屏幕上轻松识别。我没有为每个座位赋予颜色属性,而是在 Area
我的问题与此非常相似:( Binding events to buttons in an ItemsControl ) 但我没有在那里找到解决方案。我有一个 ItemsControl,在它的 Data
考虑以下 XAML
在我的主视图中,我有一个绑定(bind)到对象集合的 ItemsControl: ActivationLevelTemplate 只是另一个 View : 在这个 View 中有一
我正在使用 ItemsControl,其中 ItemsPanel 设置为 Canvas(有关更多背景信息,请参阅 this 问题)。ItemsControl 正在按我想要的方式执行,并且通过将子元素放
我有一个 ScrollViewer,里面有一个 ItemsControl。 ItemsControl 的 ItemSource 绑定(bind)到 ObservableCollection。 问题是它
我有一个带有 itemscontrol 的 WPF MVVM 应用程序。水平子项的数量受 itemscontrol 宽度的影响。只有一件事我没有解决。我试图以始终居中的方式对齐子元素。我已经用油漆制作
我有以下 XAML: 当我将数据拖到此面板上时,鼠标光标显示允许在所有子项上放置,但在任何空白区域上,光标显示禁止放置。如果我设置 AllowDro
我有一些数据要显示在 FlowDocument 中.这基本上是一个以友好方式解释数据的 View ,包括节标题、文本段落等,我将在 FlowDocumentScrollViewer 中显示这些 Vie
我有一个 ItemsControl包含我想虚拟化的数据列表,但是 VirtualizingStackPanel.IsVirtualizing="True"似乎不适用于 ItemsControl . 真
我想写一个 ItemsControl 派生的自定义控件。这部分是出于需要,部分是作为学习练习 - 请不要建议 I Style、DataTemplate、ControlTemplate 和 ListBo
我想使用ItemsControl显示重要的项目列表。 我使用ItemsControl的原因是,我正在处理的应用程序中的DataTemplate要复杂得多:提供的示例代码仅反射(reflect)了我的大
我是一名优秀的程序员,十分优秀!