如何在运行时获取TextBox的宽度?

时间:2013-01-26 15:57:49

标签: c# wpf silverlight textbox width

<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
        }
    }
}

如何动态获取TextBox的宽度? WidthActualWidth只给出了默认的编译时间值,但是在编译之后我需要Width属性。

2 个答案:

答案 0 :(得分:5)

WidthActualWidth not 为您提供默认的编译时间值。

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);
}

答案 1 :(得分:-3)

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

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