在Wpf中以自动大小宽度获取按钮宽度
get button width at auto size width in Wpf
您好,我想让我的 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”
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 引擎的工作方式),但您必须调用 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
}
第一个消息框仍会显示旧尺码,只有新尺码可用 measure/arrange。使用 DispatcherPriority.Render
调用将确保渲染发生(它将执行 measure/arrange),返回正确的新大小。
如果您不能等待调用,那么只需自己调用 Measure
和 Arrange
(传递父容器可用大小,或仅在可视化树的根元素上调用它)。
根据@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”,这是 Button
在 Content
更新后的实际大小。
您好,我想让我的 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”
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 引擎的工作方式),但您必须调用 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
}
第一个消息框仍会显示旧尺码,只有新尺码可用 measure/arrange。使用 DispatcherPriority.Render
调用将确保渲染发生(它将执行 measure/arrange),返回正确的新大小。
如果您不能等待调用,那么只需自己调用 Measure
和 Arrange
(传递父容器可用大小,或仅在可视化树的根元素上调用它)。
根据@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”,这是 Button
在 Content
更新后的实际大小。