【问题标题】:get button width at auto size width in Wpf在Wpf中以自动大小宽度获取按钮宽度
【发布时间】:2018-02-09 13:23:34
【问题描述】:

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

【问题讨论】:

  • ActualWidth 以我的经验可靠地工作。请添加足够的代码让我们重现该问题。请将其作为文本添加到您的问题中,而不是作为屏幕截图的链接。
  • 其实没有截图链接...
  • 好。让我们保持这种状态。请添加代码。 Here's a guide to writing questions that can be answered.
  • 当你更改button1 的内容时,为什么会期望button 的宽度发生变化?

标签: c# wpf button width


【解决方案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());

这应该显示“110,703”,这是 Button 在其 Content 更新后的实际大小。

【讨论】:

    【解决方案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(传递父容器可用大小,或者只是在可视树的根元素上调用它)。

    【讨论】:

      猜你喜欢
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 2021-04-04
      • 2019-01-24
      • 1970-01-01
      • 2014-01-23
      • 2012-10-05
      相关资源
      最近更新 更多