ビデオプレーヤーを入手しました。ロードされている限り、非表示になります(1対1のピクセルサイズがオブジェクトに適用されます)。ロードが完了すると、JavaScript関数が起動され、目的のサイズ(640 x 480pxなど)にサイズ変更されます。事実上、SizeChanged
イベントが発生します。その場合、適切なアスペクト比を維持するために、ハンドラーのメディア要素のサイズが変更されます。
問題は時々私が次のようなばかげたサイズになったということです:ActualWidth == 448900, ActualHeight == 286090
。
少なくともこれと同じような問題を抱えている人はいますか?テスト環境で再現できなかったため、どのように、いつ、なぜ発生するのかわかりません。任意の提案が役立つ場合があります。
SizeChangedハンドラー:
private void Player_SizeChanged(object sender, SizeChangedEventArgs e)
{
Size pSize = e.NewSize;
if (_controlPanel.Visibility == System.Windows.Visibility.Visible)
pSize = new Size(e.NewSize.Width, e.NewSize.Height - _controlPanel.PanelRoot.Height);
_videoPanel.OnParentSizeChanged(pSize);
}
VideoPanel.OnParentSizeChanged:
public void OnParentSizeChanged(Size newSize)
{
//nothing to do here
if (_lastLayoutSize != null &&
_lastLayoutSize.Width == newSize.Width &&
_lastLayoutSize.Height == newSize.Height)
return;
_lastLayoutSize = new Size(newSize.Width, newSize.Height);
ApplyAspectRatio();
}
VideoPanel.ApplyAspectRatio:
public void ApplyAspectRatio()
{
//security checks
if (_lastLayoutSize == null)
return;
if (_mediaSource == null)
{
if (_imgThumbnail != null)
{
this.Width = _lastLayoutSize.Width;
this.Height = _lastLayoutSize.Height;
}
return;
}
if (_mediaSource.Width == 0 || _mediaSource.Height == 0)
return;
double dScale = 1.0;
double dSourceHeight = 1.0;
double dSourceWidth = 1.0;
lock (_msSync)
{
dSourceWidth = _mediaSource.Width;
dSourceHeight = _mediaSource.Height;
double dHeightRatio = 1.0;
double dWidthRatio = 1.0;
dHeightRatio = _lastLayoutSize.Height / dSourceHeight;
dWidthRatio = _lastLayoutSize.Width / dSourceWidth;
dScale = System.Math.Min(dHeightRatio, dWidthRatio);
}
double nWidth = dSourceWidth * dScale;
double nHeight = dSourceHeight * dScale;
Width = MaxWidth = MinWidth = nWidth;
Height = MaxHeight = MinHeight = nHeight;
this.InvalidateArrange();
}
ロギング用のコードを削除しました。分離されたストレージにテキストを書き込んでいただけです。これらのばかげた値は、その呼び出しチェーンであるPlayer_SizeChangedメソッドの最上位で発生します。