嗨,我希望我的C#WPF程序中的按钮根据内容自动化。这就是我已经提到的。但是现在我想知道按钮的实际宽度。我尝试了button.ActualWidth
和button.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引擎的工作方式),但是您必须致电Measure
和Arrange
。
更改 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,则只需调用Measure
和Arrange
自己(传递父容器可用大小,或者只是在Visual Tree的根元素上调用)。