2017-08-31 30 views
-1

こんにちは私は自分のC#WPFプログラムのボタンをコンテンツに応じて自動サイズ調整します。これは私がすでに述べたことです。 しかし今、私はボタンが実際にどのくらいの幅を持っているか知りたいです。 button.ActualWidthbutton.widthを試しました。最初の値は "0"を返し、2番目の値は "NaN"を返します。Wpfで自動サイズの幅でボタンの幅を取得

ボタンのための私の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" このメッセージボックスが表示さ

+0

「ActualWidth」は私の経験では確実に動作します。問題を再現するのに十分なコードを追加してください。スクリーンショットのリニークとしてではなく、あなたの質問にテキストとして追加してください。 –

+0

実際にスクリーンショットへのリンクはありません... – Benziner

+0

良いです。そのように保ちましょう。コードを追加してください。 [回答できる質問を書くためのガイドはこちら](http://stackoverflow.com/help/mcve)。 –

答えて

1

@Sinatr(+1)で提案されているように、Contentプロパティを設定した後、またはWPFがあなたのために測定するまで待ってから、Buttonを測定する必要がありますが、測定時に十分なスペースを確保してくださいそれ:

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

これはそのContentが更新された後Buttonの実際のサイズである「110703」を表示する必要があります。

1

ActualWidthNaN(それは前に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を呼び出してください(親コンテナの利用可能なサイズを渡すか、ビジュアルツリーのルート要素で呼び出すだけです)。

関連する問題