問題タブ [highdpi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 非同期呼び出しが発生すると、WinForms ウィンドウのサイズが変更されます
数年前の WinForms プロジェクトがあり、非同期イベント ハンドラーがレトロフィットされています。
このメソッド内には非同期呼び出しがあります。
通常の解像度の画面でプログラムを実行すると、期待どおりに実行されます。ただし、高 DPI 画面で実行すると、ウィンドウのサイズ (およびすべての子コントロールのサイズ) は、その内部非同期呼び出しに遭遇するとすぐに半分のサイズにジャンプします。プログラムが突然互換モードで実行されたか、スケーリングが無効になったかのようです。
現在、問題をデバッグするために、GetProjectTemplateFile
メソッドは単純に
GetProjectTemplateFile
非同期操作を実行するかどうかに違いはありません。
その非同期呼び出しをコメントアウトするとGetProjectTemplateFile
、イベントで行われた他の非同期呼び出しがまだある場合でも、プログラムは次元がジャンプすることなく期待どおりに実行されますCellClick
。
.ConfigureAwait(true)
非同期呼び出しに追加しようとしましたが、違いはありません。と同期して呼び出しを実行することもありません.GetAwaiter().GetResult()
。
この特定の非同期呼び出しでウィンドウのサイズが変化する理由、および/またはこれを防ぐ方法を誰かが説明できますか?
更新
リクエストに従って、説明された動作を引き出すコードサンプルを次に示します。私が確認できる異常は何もありませんが、このコードそのものが説明された動作を引き起こしていることを保証します。
関連する可能性のあるその他の情報:
- ウィンドウの
FormBorderStyle
は「FixedToolWindow」 - 起動メソッドでウィンドウに明示的な幅が指定されている
AutoSize
= 偽AutoSizeMode
= 成長のみ- 開発中のコンピューターには、新しいスケーリング ロジックを備えた Windows 10 1703 (Creator's) 更新プログラムがありません。
GetprojectTemplateFile
メソッドが非同期でない場合、つまり署名public ProjectTemplateFile GetProjecttemplateFile(...)
がある場合は問題ありません。この問題は、メソッド呼び出しが非同期の場合にのみ存在するようです-たとえそれをブロッキング呼び出しにしても。
更新 2:
この問題を引き起こすコードの特定の行を見つけました:
内部非同期呼び出しGetProjectTemplateFile
は、API を呼び出してから、応答をチェックします。
MessageBox.Show(...)
呼び出しをコメントアウトすると、すべてが正常になり、スケーリングの問題も次元のジャンプもありません。
しかし、問題はMessageBox.Show(...)
呼び出しがインプレースである場合に発生します。
さらに、API は 200 (OK) で応答するため、MessageBox コードは使用されません。私の推測では、JIT コンパイラーはそれを可能性として認識しているので、フォームを再レンダリングしますか?
また、重要なことに、このコードはフォームの分離コードではなく、コンストラクターでフォームのインスタンスが与えられるクラスにあります。
windows-subsystem-for-linux - Windows で bash をエミュレートしているときに Cmder が正しくラップされない
少し前に、この問題を Cmder GitHub ページに投稿しました。2 週間経ってもまだ回答がないので、ここで運試しをしたいと思っていました。
基本的に、bash の実行中に Cmder でウィンドウのサイズを変更すると、奇妙な動作が見られます。
これが私が投稿した問題です:
再現するには、Cmder を開き、ウィンドウを最大化します。
- bash コンソール (Windows 上の Ubuntu の Bash) をエミュレートしているときに、コマンド ライン (つまり
PS1
、環境変数) が次の行に折り返されるように、ウィンドウ サイズを縮小します。- コマンドを実行します ( Enter1. が守られている限り、単純なキーストロークでかまいません)。
- ウィンドウ サイズを最大化し、以前の縮小されたウィンドウよりも長いコマンドを入力します。行はそれ自体を折り返す必要があります。
誰でもこの動作を再現できますか? (Microsoft Windows [バージョン 10.0.15063] を実行)
cmd.exe をエミュレートしている間、同じ動作は観察されませんでした。
さらに、アプリケーション「Bash on Ubuntu on Windows」を実行している間、この動作は観察されません。
また、ConEmu でも同じ動作が見られるかどうかを確認しようとしました。画面のサイズを変更すると、「コンソールの最大サイズに達しました。実際のコンソール プロパティでフォント サイズを小さくしてください」というメッセージが表示されます。これは、DPI の高い画面に関係している可能性があります。その上、Cmder と同じ動作が得られます。
これに関するヘルプは大歓迎です:D