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

时间:2017-08-31 14:29:10

标签: c# wpf button width

您好我希望我的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”

2 个答案:

答案 0 :(得分:2)

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

您不需要窗口(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
}

第一个消息框仍将显示旧尺寸,新尺寸仅可用于测量/排列。使用DispatcherPriority.Render调用将确保渲染发生(它将进行测量/排列),返回正确的新大小。

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

答案 1 :(得分:2)

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

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());

这应显示&#34; 110,703&#34;这是Button更新后Content的实际尺寸。