2

私の WPF アプリには、他の WPF ダイアログ ウィンドウを開くことができる WPF ウィンドウがあります。これは次のように行います。

PickForEveryone PickForEveryoneWindow = new PickForEveryone(sSelRecipe, selMRM.sDay, selMRM.MealTypeID);
PickForEveryoneWindow.Owner = this;
PickForEveryoneWindow.ShowDialog();

PickForEveryone は次のように定義されます。

public partial class PickForEveryone : Window

<Window x:Class="PFWb0.PickForEveryone"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
 ShowInTaskbar="False"
 Title="Pick Recipe For All" Height="536" Width="441" 
 WindowStartupLocation="CenterOwner">

また、DataGrid といくつかのボタンとチェック ボックスを含む Grid が含まれています。

私の開発用コンピューターでは問題なく動作します。ただし、私のクライアントは、ダイアログ ウィンドウが閉じたときに、親ウィンドウの上に視覚的なごみとしてダイアログ ウィンドウが表示の一部を残しているのを見続けます。つまり、ShowDialog() が戻ったときに一部のウィンドウだけがアンドローされます。

this.InvalidateVisual(); を追加してみました。上記のコードの下にありますが、問題は解決しませんでした。

ここで (別の種類の WPF 表示の問題について) OnRender() を呼び出して再描画を強制するという提案も見ましたが、OnRender には DrawingContext 型のパラメーターが必要であり、取得方法がわかりません。

そこで、最初に表示の問題を修正する方法、または WPF を使用してウィンドウを再描画して回復する方法を誰かが知っているかどうかを尋ねています。

更新: 以下の提案された回答へのコメントに見られるように、クライアントのコンピューターで機能する解決策はまだありません。機能する唯一のことは、汚染された下にあるウィンドウを最小化および最大化することです。

4

5 に答える 5

5

ATOM N270 プロセッサを搭載した特定のコンピューターで同様の問題が発生しました。この問題は、グラフィック ハードウェア アクセラレーションに関連しているように見えました。

アクセラレーションを無効にするには、これをレジスタに追加するだけです (これにより、すべての WPF アプリケーションのハードウェア アクセラレーションが無効になります)。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration

Avalon.Graphicsフォルダを作成する必要がありました。

DisableHWAccelerationDWORDに設定する必要があるです1

これで問題は解決しました。加速を再度有効にすると、問題が再発します。

お役に立てれば。

参考文献:

于 2012-10-05T09:46:48.157 に答える
1

この醜いコードは私にとってはうまくいきます:

        void RefreshWindow()
    {
        switch (WindowState)
        {
            case WindowState.Maximized:
                {
                    double oldWidth = Width;
                    Width = System.Windows.SystemParameters.PrimaryScreenWidth - 1;
                    WindowState = System.Windows.WindowState.Normal;
                    WindowState = System.Windows.WindowState.Maximized;
                    Width = oldWidth;
                }
                break;
            case WindowState.Normal:
                if (Width > 1)
                {
                    Width -= 1;
                    Width += 1;
                }
                else
                {
                    Width += 1;
                    Width -= 1;
                }
                break;
            case WindowState.Minimized:
            default:
                // no action necessary
                break;
        }
    }
于 2011-07-29T07:35:48.057 に答える
0

このソリューションは機能しますが、あまりきれいではありません(ダイアログが最小化されてから通常に設定されていることが簡単にわかります)。

this.WindowState = WindowState.Minimized;
this.WindowState = WindowState.Normal;
this.Topmost = true;
于 2011-02-09T08:10:48.217 に答える
0

だから私はMSフォーラムでこれに対する答えを探していました.どうやら、この質問のバリエーションは数年前から尋ねられています.

時々、問題はビデオ ドライバーに関係していると彼らは言いますが、私の場合、私のクライアントは最近ビデオ ドライバーを更新しました。

私の印象では、Microsoft は、開発者がディスプレイの再描画を強制する必要がないように WPF を設計したと考えていたので、設計上はそうする方法を作っていません。もちろん、何らかの理由で問題が発生した場合、これは簡単な方法がないことを意味します。そして、そうするように見える方法 (InvalidateVisual() など) は、そうではありません。

しかし、うまくいくハックを1つ見つけました。さて、2つ。醜いのは、ウィンドウを最小化して通常に戻すように指示することです。しかし、そうすると視覚的なアニメーションになり、理想的ではありません。私の場合、他の開いているウィンドウの後ろに隠れてしまい、一番上に表示する必要がありました。しかし、不快な方法で問題を解決します。

ShowDialog の後のコード:

    this.WindowState = WindowState.Minimized;
    this.WindowState = WindowState.Normal;
    this.Topmost = true;

より良いハックは、次のようになります。

外側のコード:

public delegate void NoArgDelegate();

ShowDialog の後のコード:

    this.Dispatcher.Invoke(
    System.Windows.Threading.DispatcherPriority.Loaded,
        (NoArgDelegate)delegate {}
    );

プレストアラカザム!

于 2011-01-19T04:48:15.457 に答える
0

これまでのところ、クライアントのコンピューターで実際に機能するものは何もありません。ウィンドウを移動し、ダイアログ ウィンドウを閉じる直前に空のウィンドウを起動して実際に有効にしようとする、クライアント テスト用の新しい修正 (回避策ハック) の試みがあります。はぁ...

于 2011-02-10T01:25:35.917 に答える