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

の幅を動的に取得するにはどうすればよいTextBoxですか?Widthデフォルトのコンパイル時の値のみを指定し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 を使用しますか? jQuery をお持ちの場合は、ネイティブの JavaScript でも非常に簡単に実行できます。

次に、JavaScript にその値を非表示の入力に投稿させ、サーバー ベースのコードで入力の値を取得して、必要な場所で使用します。

于 2013-01-26T17:03:28.527 に答える