WPF Canvas.ActualWidth即使在加载后也为零

时间:2014-03-28 12:36:53

标签: c# wpf wpf-controls width actualwidth

我无法将画布ActualWidth置于任何非零值。我简化了真实的场景,并在VS中使用了一个新的WPF应用程序来获得非零值(和理解)。不幸的是,我只有零。我觉得我错过了一些基本的WPF理解:我对WPF并不熟悉。

我复制了MDSN demo,略微修改了它,现在我已经

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

我希望画布在加载后具有与文本框相同的ActualWidth,但在指定的断点处,它为零。请注意,运行上面的代码时文本框是可见的。

有人可以告诉我如何让myCanvas.ActualWidth自动成为textbox.ActualWidth或告诉我为什么不应该这样做?

在我的实际使用场景中,我在Canvas的列中有一个Grid,其中列定义的宽度设置为auto,所以我预计它会作为画布增加'宽度增加。但是,这失败了,我怀疑它是由于canvas.ActualWidth为零。

1 个答案:

答案 0 :(得分:3)

删除此行,它将起作用:

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

注意:画布永远不会调整自身大小以适应它的内容。文本在您的示例中可见的原因是画布没有剪切它的内容。

设置

myCanvas.ClipToBounds = true;

文本也会消失。