WPF中Canvas.ActualWidth在加载后仍为零

5
我无法获得画布的ActualWidth值为非零值。我简化了实际情况并在VS中创建了一个新的WPF应用程序,以获取非零值(并理解该过程)。不幸的是,我只获得了零。我觉得我缺少一些基本的WPF理解:我对WPF并不那么熟悉。
我复制了MDSN演示,稍微修改了一下,现在我有以下代码:
public partial class MainWindow : Window {

private Canvas myCanvas;
public MainWindow()
{
    InitializeComponent();
    CreateAndShowMainWindow();
}
private void CreateAndShowMainWindow()
{
    // Create a canvas sized to fill the window
    myCanvas = new Canvas();
    myCanvas.Background = Brushes.LightSteelBlue;

    // Add a "Hello World!" text element to the Canvas
    TextBlock txt1 = new TextBlock();
    txt1.FontSize = 14;
    txt1.Text = "Hello World!";
    Canvas.SetTop(txt1, 100);
    Canvas.SetLeft(txt1, 10);
    myCanvas.Children.Add(txt1);

    // Add a second text element to show how absolute positioning works in a Canvas
    TextBlock txt2 = new TextBlock();
    txt2.FontSize = 22;
    txt2.Text = "Isn't absolute positioning handy?";
    Canvas.SetTop(txt2, 200);
    Canvas.SetLeft(txt2, 75);
    myCanvas.Children.Add(txt2);

    Grid content = new Grid();
    content.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
    content.Children.Add(myCanvas);
    this.Content = content;
    this.Loaded += MainWindow_Loaded;
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    var canvasRenderWidth = myCanvas.RenderSize.Width;
    var canvasActualWidth = myCanvas.ActualWidth;
} //place breakpoint here

在加载后,我希望画布的实际宽度与文本框相同,但在指定断点时,它的值为零。请注意,当运行上述代码时,文本框是可见的。

有人能告诉我如何使myCanvas.ActualWidth自动变为textbox.ActualWidth,或告诉我为什么不应该这样做吗?

在我的实际使用场景中,我在一个Grid列中有一个Canvas,其中列定义的宽度设置为auto,所以我希望它随着画布的宽度增加而增加。然而,这种情况失败了,我怀疑是由于canvas.ActualWidth的值为零造成的。

1个回答

3

删除这一行,它就可以工作:

content.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });

注意:画布不会自动调整大小以适应其内容。您示例中文本可见的原因是画布未剪裁其内容。
当您设置
myCanvas.ClipToBounds = true;

文本也将消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接