如何更新WPF中控件列表的绘制顺序

时间:2017-07-26 19:10:39

标签: c# wpf

我制作了一个自定义WPF编辑器,我无法获得以正确的绘制顺序显示的屏幕控制对象列表(按钮,文本框等)。这是我当前设置的视觉效果:

enter image description here

我让控制对象窗口正常工作,我可以看到列表更改的时间。

我的问题是:假设我选择了对象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
  }

我想弄清楚的是如何刷新屏幕以查看对象的正确绘制顺序?可能吗?非常感谢提前!

1 个答案:

答案 0 :(得分:0)

BringForwardSendBackward命令可以通过[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);
}

您需要确定您通过添加和删除子项操作的对象列表是否确实是那个。获取变量controlObjectListlistObjects的一些上下文以查看它们属于谁。