在Wpf中以自动大小宽度获取按钮宽度

get button width at auto size width in Wpf

您好,我想让我的 C# WPF 程序中的按钮根据内容自动调整大小。这就是我已经提到的。 但现在我想知道按钮实际的宽度是多少。 我尝试了 button.ActualWidthbutton.width。第一个返回“0”,第二个返回 "NaN".

我的XAML按钮

<Button x:Name="button1" Content="Button" HorizontalAlignment="Left" Margin="61,41,433,0" VerticalAlignment="Top" IsEnabled="False" Click="button1_Click"/>

我的按钮的新内容:

button1.Content = "new content xayxax ";

nWidth = button.ActualWidth;
MessageBox.Show(nWidth.ToString());

此消息框显示“0”

ActualWidth 永远不应该是 NaN(它从 0 开始,然后再测量和排列),但是 Width 可以。 Width == NaN 表示控件宽度不是 locally set 并且控件的实际大小将取决于布局。

使用ActualWidth获取控件的宽度测量和排列后:

var button = new Button();
button.Content = "123";
button.HorizontalAlignment = HorizontalAlignment.Left;
button.Measure(new Size(100, 100));
button.Arrange(new Rect(0, 0, 100, 100));
MessageBox.Show(button.ActualWidth.ToString()); // Output: 23,41

您甚至不需要 window(WPF 引擎的工作方式),但您必须调用 MeasureArrange.

更改Content不会刷新控件,那会在一段时间后发生,您可以像这样调用来获取它:

void button_Click(object sender, RoutedEventArgs e)
{
    button.Content = "123";
    //MessageBox.Show(button.ActualWidth.ToString()); // output: 0
    Dispatcher.Invoke(() => MessageBox.Show(button.ActualWidth.ToString()), DispatcherPriority.Render); // correct output
}

第一个消息框仍会显示旧尺码,只有新尺码可用 measure/arrange。使用 DispatcherPriority.Render 调用将确保渲染发生(它将执行 measure/arrange),返回正确的新大小。

如果您不能等待调用,那么只需自己调用 MeasureArrange(传递父容器可用大小,或仅在可视化树的根元素上调用它)。

根据@Sinatr (+1) 的建议,您需要在设置 Content 属性 后测量 Button - 或者等到 WPF 为您测量它 - 但是确保在测量时使用足够大的可用 space:

button1.Content = "new content xayxax ";
var size = new Size(double.PositiveInfinity, double.PositiveInfinity);
button1.Measure(size);
button1.Arrange(new Rect(button1.DesiredSize));
MessageBox.Show(button1.ActualWidth.ToString());

这应该显示“110,703”,这是 ButtonContent 更新后的实际大小。