你好我有以下问题:我想在画布上使用Canvas.SetLeft()和Canvas.SetTop()方法绘制一个矩形。
我使用UserControl_Loaded()方法,一切正常。 问题是,在调整窗口大小并因此调整网格时使用ActualWidth,值不会改变,我离开的值不再准确。
map.plot +
geom_polygon(data = tx_county, aes(x=long, y=lat, group = group), fill = NA, color = "red")
这是xaml:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Rectangle rett = new Rectangle();
rett.Height = grid1.ActualHeight-10;
rett.Width = grid1.ActualWidth -10;
rett.Fill = new SolidColorBrush(Colors.LightBlue);
canv.Children.Add(rett);
Canvas.SetLeft(rett, 10);
Canvas.SetTop(rett, 10);
}
在第一张图片中没有调整窗口大小就可以了。
当我调整网格大小时,第二个仍然是之前的宽度。
我希望在更改网格宽度时更新矩形的宽度。 谢谢。
答案 0 :(得分:0)
如果没有a good, minimal, complete code example清楚地说明你的问题,以及你实际想要完成的事情的详细解释(特别是在更广泛的意义上),我们无法确定你的最佳答案是什么。案件将是。
从字面上理解你的问题,似乎一种可能的方法是将Rectangle
维度绑定到Grid
的维度,以便在Grid
更改大小时更新它们。您可以使用IValueConverter
从实际尺寸中减去适当的金额。
但对于原本本来是一个相当简单的问题来说,这是一个相当复杂的解决方案,特别是考虑到你似乎是出于某种原因在代码隐藏中这样做(首先不理想,并设置绑定)代码隐藏特别乏味。
惯用,应该可能正在做的事情并不是将Rectangle
放在Canvas
中,而是让它成为Grid
的孩子直。然后你可以将它的对齐方式设置为Stretch
,这样就可以填充它所在的网格单元格。最后,你可以设置它的边距,使你在顶部和左边有10个像素的间隙,右边没有间隙和底部。
例如:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Rectangle rett = new Rectangle();
rett.Fill = new SolidColorBrush(Colors.LightBlue);
// NOTE: technically don't need to set these, as Stretch is the default value!
rett.HorizontalAlignment = HorizontalAlignment.Stretch;
rett.VerticalAlignment = VerticalAlignment .Stretch;
// 10 pixels of margin on top and left, none on right and bottom
rett.Margin = new Thickness(10, 10, 0, 0);
grid1.Children.Add(rett);
}
如上所述,XAML布局引擎可以自动处理您要查找的调整大小行为。
所有这一切,我绝对鼓励你在XAML而不是代码隐藏中实现它。代码隐藏很多东西都很擅长,但坦率地说,XAML在与GUI对象图的配置直接相关的任何事情上要好得多。