我制作了一个自定义WPF编辑器,我无法获得以正确的绘制顺序显示的屏幕控制对象列表(按钮,文本框等)。这是我当前设置的视觉效果:
我让控制对象窗口正常工作,我可以看到列表更改的时间。
我的问题是:假设我选择了对象3并按下向上按钮。对象应该在列表中向上移动(它确实如此!)但是绘制顺序保持不变。意味着对象3应该在对象2后面绘制,而不是这样做。我不知道为什么。
这是我的代码:
private void MoveUp_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < controlObjectList.Count; i++)
{
if (controlObjectList[i].IsSelected)
{
// Copy the current item
var selectedItem = controlObjectList[i];
int newindex = Math.Abs(i - 1);
// Remove the item
controlObjectList.RemoveAt(i);
// Finally add the item at the new index
controlObjectList.Insert(newindex, selectedItem);
}
}
RefreshControlObjectList(controlObjectList);
}
private void MoveDown_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < screenDesigner.m_ParentScreenObject.controlObjects.Count; i++)
{
if (controlObjectList[i].IsSelected)
{
// Copy the current item
var selectedItem = controlObjectList[i];
int newindex = i + 1;
if(newindex < controlObjectList.Count)
{
// Remove the item
controlObjectList.RemoveAt(i);
// Finally add the item at the new index
controlObjectList.Insert(newindex, selectedItem);
}
}
}
RefreshControlObjectList(controlObjectList);
}
private void RefreshControlObjectList(List<ItemsList> newList)
{
newList.Items.Clear();
foreach (ItemsList il in controlObjectList)
{
listObjects.Items.Add(il);
}
//I know this is where I should place the logic for the draw order...
}
#endregion
}
我想弄清楚的是如何刷新屏幕以查看对象的正确绘制顺序?可能吗?非常感谢提前!
答案 0 :(得分:0)
BringForward
和SendBackward
命令可以通过[1]改变子节点的顺序或[2]通过改变它们的ZIndex来实现,实际上在引入ZIndex依赖属性之前它只有通过改变容器中儿童的顺序才能实现。
您是否有机会获得完整的代码示例?如果不是这里是一个示例标记和代码的示例,它证明它确实有效,但是要注意该方法可能对性能产生影响,因为引入了ZIndex来修复它们。
<Canvas Name="container" MouseDown="OnMouseDown">
<Ellipse Canvas.Left="50" Canvas.Top="10" Fill="Red" Height="100" Width="100"></Ellipse>
<Ellipse Canvas.Left="100" Canvas.Top="20" Fill="Green" Height="100" Width="100"></Ellipse>
<Ellipse Canvas.Left="150" Canvas.Top="30" Fill="Blue" Height="100" Width="100"></Ellipse>
</Canvas>
private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
var uiElement = e.Source as Ellipse;
container.Children.Remove(uiElement);
container.Children.Add(uiElement);
}
您需要确定您通过添加和删除子项操作的对象列表是否确实是那个。获取变量controlObjectList
和listObjects
的一些上下文以查看它们属于谁。