【发布时间】:2017-10-06 04:46:52
【问题描述】:
我正在使用 Infragistics XamDialogWindow 来近似 WPF 中的 MDI 窗口。
基本上,我有一个分配给窗口内容的用户控件,然后将 XamDialogWindow 添加为 Grid 的子项。
然后我有两个按钮,它们将窗口显示为“平铺”或“层叠”。
级联效果非常好,但我在使用 Tile 方法时遇到了问题。
我使用容器的“ActualWidth”和“ActualHeight”属性获取可用的宽度和高度。
然后我计算所需的行数和列数。
接下来我遍历列并计算一列中有多少行(这意味着如果有奇数个窗口,例如 5,我将在第 0 列有两行,在第 1 列有 3 行) .
每个窗口的宽度计算为“AvailableWidth / numColumns”
每个窗口的高度计算为“AvailableHeight / WindowsForThisColumn”
然后我遍历行并计算我们定位的窗口的左上角坐标如下:
left = columnIndex * width
top = rowIndex * 高度
然后设置窗口的 Left、Top、Width 和 Height 属性。
问题
Left、Top、Width 和 Height 属性似乎计算正确,例如
- 可用宽度 = 1000;
- AvailableHeight = 1000;
- Window1 = 0, 0, 500, 500
- Window2 = 0, 500, 500, 500
- Window3 = 500, 0,500, 500
- Window4 = 500、500、500、500
这应该会给出一个漂亮的 4 个窗口网格,没有边距填充所有可用空间,但这不是结果。
窗口在显示时似乎是偏移的(见下图)。
如果我查看 Left、Top、Width 和 Height 属性,它们似乎都是正确的。
奇怪的是,如果我再次点击“平铺”,它们都会正确显示。
如果我在第二次单击磁贴后移动窗口,它们将正确显示。
我尝试使用 Canvas 并设置 Canvas.Left 和 Top 属性、网格、stackpanel 和 wrappanel,每次都具有相同的结果。
谁能帮助我?我认为这可能是 WPF 如何在渲染时测量大小和位置的问题
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++;
}
}
}
【问题讨论】:
-
请给我您的示例代码,以便我处理它。我想要它在真实样本上进行调试。
-
您是否按照您的问题回答?
-
你的问题是什么?你只写“正确”和“正确”
-
正确的是图像中的 4 个图块出现在没有重叠的网格中。不正确的是图像在图块重叠和略微偏移的位置显示方式
标签: c# wpf infragistics