WPF画布.ActualWidth为零,即使在加载后
本文关键字:加载 画布 ActualWidth 为零 WPF | 更新日期: 2023-09-27 17:54:21
我无法让画布的ActualWidth
为任何非零值。我简化了真实的场景,并在VS中投入了一个新的WPF应用程序来获取非零值(和理解)。不幸的是,我只能得到0。我觉得我错过了一些基本的WPF理解:我不是那么熟悉WPF。
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
或告诉我为什么不应该这样做?
在我的实际使用场景中,我在Grid
的In列中有一个Canvas
,其中columndefinition的宽度设置为auto,因此我预计它会随着画布宽度的增加而增加。然而,这失败了,我怀疑这是由于canvas.ActualWidth
为零。
删除这一行,它就可以工作了:
content.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
注意:画布永远不会调整自己的大小来适合它的内容。在你的例子中,文本是可见的原因是画布没有裁剪它的内容。
设置
myCanvas.ClipToBounds = true;
文本也会消失