Ste*_*ood 6 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属性.
问题
例如,Left,Top,Width和Height属性似乎正确计算
这应该给出一个4个窗口的漂亮网格,没有边距填充所有可用空间,但这不是结果.
窗口似乎在显示时偏移(见下图).
如果我查看Left,Top,Width和Height属性,它们看起来都是正确的.
奇怪的是,如果我第二次单击"Tile",它们将全部正确显示.
如果我在第二次单击平铺后移动窗口,它们将正确显示.
我尝试过使用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++;
}
}
}
Run Code Online (Sandbox Code Playgroud)