使用Infragistics对话框窗口

时间:2017-05-08 08:44:04

标签: c# wpf infragistics

我正在使用Infragistics XamDialogWindow来近似WPF中的MDI窗口。

基本上我有一个用户控件,我分配给窗口的内容,然后将XamDialogWindow添加为Grid的子项。

然后我有两个按钮,将窗口显示为“Tile”或“Cascade”。

级联效果非常好,但是我遇到了Tile方法的问题。

使用容器的“ActualWidth”和“ActualHeight”属性获取可用的宽度和高度。

然后我计算所需的行数和列数。

接下来,我遍历列并计算列中有多少行(这意味着如果有奇数个窗口,例如5,我将在列0中有两行,在第1列中有3行)

每个窗口的宽度计算为“AvailableWidth / numColumns”

每个窗口的高度计算为“AvailableHeight / WindowsForThisColumn”

然后我遍历行并计算我们定位的窗口的左上角坐标,如下所示:

left = columnIndex * width

top = rowIndex * height

然后设置窗口的Left,Top,Width和Height属性。

问题

左,顶部,宽度和高度属性似乎正确计算,例如

  • AvailableWidth = 1000;
  • AvailableHeight = 1000;
  • Window1 = 0,0,500,500
  • Window2 = 0,500,500,500
  • Window3 = 500,0,500,500
  • Window4 = 500,500,500,500

这应该给出一个4个窗口的漂亮网格,没有边距填充所有可用空间,但这不是结果。

显示时窗口似乎偏移(见下图)。

如果我查看左,顶部,宽度和高度属性,它们看起来都是正确的。

奇怪的是,如果我第二次点击“Tile”,它们都会正确显示。

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

我尝试过使用Canvas并设置Canvas.Left和Top属性,每次都有相同结果的网格,堆叠面板和包装。

任何人都可以帮助我吗?我认为这可能是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++;
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

我用你的代码片段重现了这个问题。请点击以下超链接访问以下论坛帖子Infragistics以获取进一步说明。

  • Michael DiFilippo
相关问题