web-dev-qa-db-ja.com

ウィンドウWPFの高さ/幅を取得します

私は次のコードを持っています

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

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

9
Welsh King

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

_WindowState == Normal_の場合これは、IntializeComponent()の後に_Width / Height_から実行できます。

_WindowState == Maximized_の場合、これの画面解像度は次のように取得できます。

_System.Windows.SystemParameters.PrimaryScreenHeight;
System.Windows.SystemParameters.PrimaryScreenWidth;
_
9
Andy

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であることを確認するためにいくつかのチェックを行う必要があります(どちらでもかまいません)。

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

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

[〜#〜] note [〜#〜] 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;
    }
6
kformeck

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

5
David Bekham

[〜#〜] xaml [〜#〜]

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

[〜#〜] cs [〜#〜] InitializeComponent();の後のMainWindow()

    Back_Image.Width = Grid1.Width;
    Back_Image.Height = Grid1.Height;
3
Vilintritenmert

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

追加したいだけです。サイズに依存するロジックの量を最小限に抑えるようにしてください。ほとんどの場合、それを回避することができます。もちろん、レイアウトパネルを書いているのでなければ。

1
dowhilefor

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

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

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

1
Edheo