更改网格宽度时更新矩形的宽度

时间:2015-10-15 19:13:16

标签: c# xaml uwp

你好我有以下问题:我想在画布上使用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);
    }

在第一张图片中没有调整窗口大小就可以了。

OK

当我调整网格大小时,第二个仍然是之前的宽度。

NO

我希望在更改网格宽度时更新矩形的宽度。 谢谢。

1 个答案:

答案 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对象图的配置直接相关的任何事情上要好得多。