Infragistics对话框窗口中平铺窗口偏移

6
我正在使用Infragistics XamDialogWindow来在WPF中模拟MDI窗口。基本上,我有一个用户控件,我将其分配给窗口的内容,然后将XamDialogWindow添加为Grid的子级。然后我有两个按钮,可以将窗口显示为“平铺”或“层叠”。层叠效果非常好,但我在平铺方法方面遇到了问题。我使用容器的“ActualWidth”和“ActualHeight”属性获取可用宽度和高度。然后我计算所需的行数和列数。接下来,我遍历列,并计算一列中有多少行(这意味着如果有5个窗口这样的奇数,我将在第0列中有两行,在第1列中有3行)。每个窗口的宽度计算为“AvailableWidth / numColumns”,每个窗口的高度计算为“AvailableHeight / WindowsForThisColumn”。然后,我遍历行并计算我们正在定位的窗口的左上坐标,如下所示:left = columnIndex * width,top = rowIndex * height。然后设置窗口的Left、Top、Width和Height属性。

问题

左、上、宽度和高度属性似乎被正确计算,例如:

  • 可用宽度 = 1000;
  • 可用高度 = 1000;
  • 窗口1 = 0, 0, 500, 500
  • 窗口2 = 0, 500, 500, 500
  • 窗口3 = 500, 0, 500, 500
  • 窗口4 = 500, 500, 500, 500

这应该给出一个漂亮的网格,由四个没有边距的窗口填充所有可用空间,但实际结果并非如此。

当显示窗口时,它们似乎会偏移(请参见下面的图像)。

如果我查看左、上、宽度和高度属性,它们都似乎是正确的。

奇怪的是,如果我点击“平铺”两次,它们将全部正确地显示。

如果我在点击第二次平铺后移动一个窗口,则它们将正确地显示。

我已尝试使用Canvas并设置Canvas.Left和Top属性,Grid、StackPanel和WrapPanel,每次都得到相同的结果。

有人可以帮我吗?我认为这可能与WPF在渲染时测量尺寸和位置的方式有关。

ImagesOffset

 var childrenToArrange = Children.Where(a => a.WindowState != Infragistics.Controls.Interactions.WindowState.Minimized).ToList();

        var availableWidth = Panel.ActualWidth;
        var availableHeight = Panel.ActualHeight;

        if (Layout == MDILayout.TILE)
        {
            //get the number of rows and columns
            int rows = (int)Math.Sqrt(childrenToArrange.Count);
            int columns = childrenToArrange.Count / rows;

            var index = 0;
            var width = availableWidth / columns;

            //iterate through the columns
            for (int x = 0; x < columns; x++)
            {
                //get the number of windows for this column
                var windowsForThisColumn = rows;
                if (childrenToArrange.Count % columns > (columns - x - 1))
                    windowsForThisColumn++;

                var height = availableHeight / windowsForThisColumn;

                //iterate through the rows
                for (int y = 0; y < windowsForThisColumn; y++)
                {
                    //get the X and Y coordinates
                    var left = x * width;
                    var top = y * height;

                    //get the window
                    var mdiChild = childrenToArrange[index] as XamDialogWindow;

                    mdiChild.Margin = new Thickness(0);
                    mdiChild.Left = left;
                    mdiChild.Top = top;
                    mdiChild.Width = width;
                    mdiChild.Height = height;
                    index++;
                }
            }
        }

请给我你的样本代码,以便我对其进行调试。我想要在真实样本上进行调试。 - Shahrooz Ansari
你有跟进你的问题吗? - Shahrooz Ansari
你有什么问题吗?你只写了“正确”和“正确地”。 - Dominic Jonas
正确的方式是图像中的四个方块以网格形式呈现,没有重叠。不正确的方式是图像中方块重叠且稍微偏移。 - Steven Wood
1个回答

1

我已经使用您的代码片段重现了该问题。请点击以下超链接,前往Infragistics论坛帖子获取进一步的说明。

  • Michael DiFilippo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接