-1
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBox Name="TextBox1" HorizontalAlignment="Left" PreviewKeyUp="TextBox_PreviewKeyUp"></TextBox>
        </StackPanel>
    </Grid>
</Window>  

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void TextBox_PreviewKeyUp(object sender, KeyEventArgs e)
        {
            TextBox1.Text = "Some text inside Textbox";
            MessageBox.Show("TextBox1 Width = " + TextBox1.Width + " & TextBox1.ActualWidth = " + TextBox1.ActualWidth); // NaN & 10
        }
    }
}

如何动态获取宽度TextBoxWidth并且ActualWidth只给我默认的编译时间值,但在编译后我需要 Width 属性。

4

2 回答 2

5

Width并且ActualWidth不要你默认的编译时间值。

Width请求的大小。

ActualWidth渲染的大小。来自 MSDN

ActualWidth 是一个计算值,由于布局系统的操作,该值可能有多次或增量报告的更改。如果您在布局仍在迭代时获取该值,则布局系统可能仍在计算子对象所需的空间度量、父对象的约束等。

在您的情况下,如果您想要项目的实际大小,请使用ActualWidth.

编辑:根据您的评论,我将向您展示如何通过使用 BeginInvoke 使您的特定方法起作用,以使 ActualWidth 有机会被计算:

private void TextBox1_PreviewKeyUp_1(object sender, KeyEventArgs e)
{
        TextBox1.Text = "Some other text";
        Dispatcher.BeginInvoke((Action)new Action(() =>
            MessageBox.Show("TextBox1 Width = " + TextBox1.Width + " & TextBox1.ActualWidth = " + TextBox1.ActualWidth)),
          System.Windows.Threading.DispatcherPriority.Input);
}
于 2013-01-26T16:02:14.400 回答
-3

使用 JavaScript,因为它是在客户端获得正确大小的 Textarea 的唯一方法,因为它们可以使用任何浏览器?如果你有 jQuery 很容易做也可以用原生 javascript 来做。

然后让 JavaScript 将该值发布到隐藏输入中,并在基于服务器的代码中获取输入的值以在需要时使用。

于 2013-01-26T17:03:28.527 回答