我无法将画布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
为零。
答案 0 :(得分:3)
删除此行,它将起作用:
content.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
注意:画布永远不会调整自身大小以适应它的内容。文本在您的示例中可见的原因是画布没有剪切它的内容。
设置
时myCanvas.ClipToBounds = true;
文本也会消失。