2017-08-31 334 views
-1

嗨我希望我的C#WPF程序中的按钮能够根据内容自动调整大小。这是我已经提到的。 但是现在我想知道按钮的实际宽度。我试过button.ActualWidthbutton.width。第一个返回“0”,第二个返回“NaN”。在Wpf中获取自动调整宽度的按钮宽度

我的按钮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”

+0

'ActualWidth'在我的经验中可靠地工作。请为我们添加足够的代码来重现此问题。请将它作为文本添加到您的问题中,而不是作为截图的附件。 –

+0

其实没有链接到截图...... – Benziner

+0

好。让我们保持这种方式。请添加代码。 [这是一个编写可以回答的问题的指南](http://stackoverflow.com/help/mcve)。 –

回答

1

正如@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()); 

这应该显示“110703”,这是Button的实际大小的Content已更新后。

1

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(通过父容器的可用大小,或者直接在可视化树的根元素上调用它)。