1

ゲームで奇妙な問題が発生しました。ハイスコ​​アを取得すると、Xaml テキスト ボックスが有効になり、タップしてオンスクリーン キーボードを呼び出すことができます。しかし最近、これが壊れました。.xaml 内にテキスト ボックスを作成し、visibility.collapsed をオンにして、txtTest という名前を付けました。ゲームをロードするときに、イベントハンドラーを接続します

txtTest.PointerPressed += txtTest_PointerPressed;
txtTest.AddHandler(PointerPressedEvent, new Windows.UI.Xaml.Input.PointerEventHandler(txtTest_PointerPressed), true);

ハイスコ​​ア画面に入ると、テキストボックスが表示されますが不透明度が0になり、場所とサイズが設定されるイベントが発生します。

Thickness margin = txtTest.Margin;
margin.Left = 1350 * _game.scale.X;
margin.Top = 770 * _game.scale.Y;
margin.Bottom = 240 * _game.scale.Y;
margin.Right = 200 * _game.scale.X;
txtTest.Margin = margin;
txtTest.Width = 300 * _game.scale.X;
txtTest.Height = 70 * _game.scale.Y;

txtTest.MaxLength = 10;
txtTest.Text = string.Empty;
txtTest.Visibility = Visibility.Visible;
txtTest.Opacity = 0;

これを最初に実行したときはすべてうまくいきましたが、最近は機能しなくなりました。問題は、テキスト ボックスが作成され、すべての値が設定されているが、表示されないことです。テキストボックスには場所と Visibility.Visible があるので、描画する必要がありますが、描画しません。

これは現在、Surface Pro または Acer W500 などのネイティブ タッチ対応デバイスでのみ発生します。これを RT デバイスまたはデスクトップで実行すると問題なく動作し、マウスでクリックすることもできますが、タッチ対応デバイスを実行すると、ハンドラーが起動しなくても、テキスト ボックスが存在しないように感じられます。フォーカスを設定しても何も起こりません。

誰も手がかりを持っていますか?

4

1 に答える 1

0

Windows 8 には、特に XAML 要素に影響を与える Metro アプリに DPI スケールを強制するという奇妙な動作があります。1920x1080 の 10.1 インチ画面でゲームを実行すると、DPI スケールは 140 になるため、有効な解像度は

1920 / 1,4 = 1371 1080 / 1,4 = 771

質問ではmargin.topを770に配置したため、最後のピクセルでテキストボックスを描画するため、有効解像度が1371x771であるため、テキストボックスが表示されません

したがって、それを行う適切な方法は、スケール係数が何であるかを確認し、マージンをその値で割ることです。

var scaler = 1f;

if (Windows.Graphics.Display.DisplayProperties.ResolutionScale == Windows.Graphics.Display.ResolutionScale.Scale180Percent)
{
     scaler = 1.8f;
}
else if (Windows.Graphics.Display.DisplayProperties.ResolutionScale == Windows.Graphics.Display.ResolutionScale.Scale140Percent)
{
     scaler = 1.4f;
}
else if (Windows.Graphics.Display.DisplayProperties.ResolutionScale == Windows.Graphics.Display.ResolutionScale.Scale100Percent)
{
     scaler = 1.0f;
}

Thickness margin = txtTest.Margin;
margin.Left = (1350 * _game.scale.X) / scaler;
margin.Top = (765 * _game.scale.Y) / scaler;
margin.Bottom = (220 * _game.scale.Y) / scaler;
margin.Right = (250 * _game.scale.X) / scaler;
txtTest.Margin = margin;

これで修正され、正しい方法でテキストボックスが初期化されます。

于 2013-10-14T21:07:50.377 に答える