私は次のコードを持っています
<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;
}
アプリケーションはフルスクリーンで実行されません。
InitializeComponent
が実行された後、ウィンドウがコンストラクター内にあるはずの幅と高さを取得できます。これらはNaN
を返さないため、実際の高さと幅は待機する必要があります。ウィンドウが表示されるまで。
_WindowState == Normal
_の場合これは、IntializeComponent()
の後に_Width / Height
_から実行できます。
_WindowState == Maximized
_の場合、これの画面解像度は次のように取得できます。
_System.Windows.SystemParameters.PrimaryScreenHeight;
System.Windows.SystemParameters.PrimaryScreenWidth;
_
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;
}
ウィンドウがUIにロードされたら、ActualWidth/ActualHeight
値を取得する必要があります。 Window_Loadedでそれを行うとうまくいきます。
[〜#〜] 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;
WPFは、遅延した方法でコントロールとウィンドウの作成を行います。したがって、ウィンドウが初めて表示されるまで、まだレイアウトが完了していない可能性があります。したがって、ActualWidth
/ActualHeight
はありません。ウィンドウがロードされるまで待ってからプロパティを取得するか、これらのプロパティを必要なターゲットにバインドすることをお勧めします。 UpdateLayout()
を介してレイアウトを強制することもできます。
追加したいだけです。サイズに依存するロジックの量を最小限に抑えるようにしてください。ほとんどの場合、それを回避することができます。もちろん、レイアウトパネルを書いているのでなければ。
Withが100%のコントロールを使用すると、表示されるまでNaNサイズになることに注意してください。
Loadedイベントが発生したときにだけ、ActualHeighまたはActualWidthを確認できますが、ウィンドウコントロールが作成される前に確認しないでください。コンストラクタでそれを制御するという考えを忘れてください。
私の意見では、この種のものを制御するのに最適な場所は、SizeChangedイベントです。