14

次のコードがあります

<Window x:Class="Netspot.DigitalSignage.Client.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" WindowStyle="SingleBorderWindow" 
        WindowStartupLocation="CenterScreen"
        WindowState="Normal" Closing="Window_Closing">

高さ/幅を取得しようとすると、NaN または 0.0 が返されます

誰かがそれを得る方法を教えてもらえますか?

これらの2つの方法は機能しません

//Method1
var h = ((System.Windows.Controls.Panel)Application.Current.MainWindow.Content).ActualHeight;
var w = ((System.Windows.Controls.Panel)Application.Current.MainWindow.Content).ActualWidth;

//Method2
double dWidth = -1;
double dHeight = -1;
FrameworkElement pnlClient = this.Content as FrameworkElement;
if (pnlClient != null)
{
     dWidth = pnlClient.ActualWidth;
     dHeight = pnlClient.ActualWidth;
}

アプリケーションはフルスクリーンで実行されません。

4

6 に答える 6

12

1.) コード ビハインドでウィンドウのサイズ変更イベントをサブスクライブします。

this.SizeChanged += OnWindowSizeChanged;

2.) SizeChangedEventArgs オブジェクト 'e' を使用して、必要なサイズを取得します。

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    double newWindowHeight = e.NewSize.Height;
    double newWindowWidth = e.NewSize.Width;
    double prevWindowHeight = e.PreviousSize.Height;
    double prevWindowWidth = e.PreviousSize.Width;
}

これは非常に一般的なケースであることに注意してください。サイズの値が 0 であることを確認するために、いくつかのチェックを行う必要がある場合があります (そうでない場合もあります)。

これを使用して、メイン ウィンドウの変更に合わせてリスト ボックスのサイズを動的に変更しました。基本的に私が望んでいたのは、このコントロールの高さをウィンドウの高さの変化と同じ量だけ変化させて、親の「パネル」がウィンドウの変更全体で一貫して見えるようにすることだけでした。

これは、より具体的な例のコードです。

: Window コード ビハインドのコンストラクターで 0 に設定されている 'resizeMode' という名前のプライベート インスタンス整数があります。

OnWindowSizeChanged イベント ハンドラは次のとおりです。

    protected void OnWindowSizeChanged (object sender, SizeChangedEventArgs e)
    {
        if (e.PreviousSize.Height != 0)
        {
            if (e.HeightChanged)
            {
                double heightChange = e.NewSize.Height - e.PreviousSize.Height;
                if (lbxUninspectedPrints.Height + heightChange > 0)
                {
                    lbxUninspectedPrints.Height = lbxUninspectedPrints.Height + heightChange;
                }
            }
        }
        prevHeight = e.PreviousSize.Height;
    }
于 2014-04-04T18:30:08.073 に答える
11

ウィンドウが実行された後にコンストラクターにあるはずの幅と高さを取得できますがInitializeComponent、それらは返されずNaN、実際の高さと幅はウィンドウが表示されるまで待つ必要があります。

WindowState == Normalからこれができるとき。Width / HeightIntializeComponent()

WindowState == Maximizedこれで画面解像度を取得できる場合

System.Windows.SystemParameters.PrimaryScreenHeight;
System.Windows.SystemParameters.PrimaryScreenWidth;
于 2012-06-13T11:01:23.270 に答える
5

ActualWidth/ActualHeightウィンドウが UI にロードされたら、値を取得する必要があります。Window_Loaded でそれを行うとうまくいきます。

于 2012-06-13T12:40:51.500 に答える
5

XAML

<Grid x:Name="Grid1">
      <Image x:Name="Back_Image" HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>

CS MainWindow() after InitializeComponent();

    Back_Image.Width = Grid1.Width;
    Back_Image.Height = Grid1.Height;
于 2015-11-22T06:05:40.310 に答える
1

100% の with でコントロールを使用すると、表現されるまで NaN サイズになることに注意してください。

Loaded イベントが発生したときに ActualHeigh または ActualWidth を確認できますが、Windows コントロールが作成される前に確認しようとしないでください。コンストラクターでそれを制御するという考えを忘れてください。

私の意見では、この種のことを制御するのに最適な場所は SizeChanged イベントです

于 2016-05-18T23:18:24.517 に答える
1

WPF は、遅延方式でコントロールとウィンドウの作成を行います。そのため、ウィンドウが初めて表示されるまで、まだレイアウトが行われていない可能性があるため、ActualWidth/はありませんActualHeight。ウィンドウが読み込まれるまで待ってからプロパティを取得するか、これらのプロパティを必要なターゲットにバインドすることをお勧めします。を介してレイアウトを強制することもできますUpdateLayout()

追加したいのは、サイズに依存するロジックの量を最小限に抑えることです。ほとんどの場合、それを回避できます。もちろん、レイアウト パネルを作成している場合を除きます。

于 2012-06-13T10:58:25.703 に答える