1

我有一个代表一些数据的网格,我需要一个画布覆盖在它上面来布局一些线条。画布在它自己的用户控件内

问题是当网格调整宽度和高度时,画布及其内容应该自动调整大小。

我在视图框中添加了画布,但它没有起到作用。当网格调整大小时,画布不会。画布的目的是在网格顶部覆盖类似标尺的功能。

我不能使用网格上的样式来替换画布,因为网格显示的信息与画布不同。将其视为图表,其中有不同大小的条形列(在我的情况下为网格),而日期是叠加层中的线(就像甘特图一样)

我的代码:

taxCanvas = new TimeAxis();
Grid.SetRowSpan(taxCanvas, GRightMain.RowDefinitions.Count);
Grid.SetColumnSpan(taxCanvas, GRightMain.ColumnDefinitions.Count);
Grid.SetColumn(taxCanvas, 0);    Grid.SetRow(taxCanvas, 0); 
Grid.SetZIndex(taxCanvas, -1);
taxCanvas.Height = GRight.ActualHeight;
taxCanvas.Width = GRight.ActualWidth;
GRightMain.Children.Add(taxCanvas);

TimeAxis 是我的画布用户控件,GRightMain 是一个网格,其中包含我的画布和网格,内容(Gright)在同一行和列中。

4

2 回答 2

1

问题的直接原因是以下几行:

taxCanvas.Height = GRight.ActualHeight;
taxCanvas.Width = GRight.ActualWidth;

这将为您的 TimeAxis 控件设置一个固定大小,禁用任何自动调整大小。

假设您的 TimeAxis 用户控件没有任何影响度量的内部设置,将 Height 和 Width 设置替换为以下内容应该会导致您的 UserControl 自动调整大小。

taxCanvas.HorizontalAlignment = HorizontalAlignment.Stretch;
taxCanvas.VerticalAlignment = VerticalAlignment.Stretch;

但是,这可能无法完全解决您的问题;您的 UserControl 所需的大小和布局大小将与网格的相同,但您仍需要手动调整画布上对象的大小。Canvas 没有任何测量/排列的规定,因此您必须使用代码处理此问题。常用技术有:

  1. 将 Canvas 包装在您已经尝试过的 ViewBox 中。您可以通过更改上述行再试一次。
  2. 使用代码或绑定调整画布的RenderTransform(比调整LayoutTransform效率更高,而且Canvas反正不参与布局)
  3. 使用代码或绑定调整单个形状位置

需要注意的一个问题:调整画布大小时,它的内容不会受到影响。所以如果你想知道你的画布是否真的被调整大小,给它一个背景颜色。这样您就不会浪费时间在错误的地方寻找尺寸问题。

于 2009-11-02T16:51:35.997 回答
0

您的 GRightMail 控件是一个网格,默认情况下会拉伸其内容。如果您的数据和 TimeAxis 控件都在同一个网格单元格(以及相同的行/列跨度)中,它们应该一起拉伸。

如果仍然不是这种情况,请检查您的 TimeAxis 是否没有固定的宽度或高度,或定义的水平/垂直对齐。

于 2009-11-02T14:48:04.657 回答