在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"

按照@Sinatr( 1)建议,您需要在设置其Content属性后测量Button - 或等到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());

这应该显示" 110,703",这是Button更新后CC_5的实际大小。

ActualWidth永远不应是 NaN(它是从 0开始,然后在测量和安排之前开始),但是 Width可以。Width == NaN表示没有局部设置控制宽度,并且控制实际尺寸将取决于布局。

使用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调用将确保发生什么渲染(将进行测量/安排),返回正确的新尺寸。

如果您迫不及待地等待Invoke,则只需调用MeasureArrange自己(传递父容器可用大小,或者只是在Visual Tree的根元素上调用)。

最新更新