2

WPFアプリケーションに奇妙なバグを発見しました。適切な会社に報告できるように、それがWPFまたはグラフィックスドライバーの問題であるかどうかを判断しようとしています。.NET 3.5SP1アプリケーションを実行しているWindowsXPシステムに最新のドライバー(197.54)を搭載したQuadroFX1700があります。

デュアルモニターがあり、プライマリが左側に、セカンダリが右側にあります。この問題は、プライマリモニターのメインウィンドウの子ウィンドウを最大化してから復元すると発生します。子ウィンドウのサイズはプライマリモニターで正しく設定されていますが、セカンダリモニターでは、最大化されているかのように描画されます。プライマリモニターで子ウィンドウを移動すると、セカンダリモニターでも子ウィンドウが移動します。

復元された子ウィンドウは、まだ最大化されているかのようにセカンダリモニターに描画されます

この動作を引き起こすサンプルアプリケーション(コードは以下)を作成しました。

  1. アプリケーションを起動し、メインウィンドウがプライマリモニターに表示されていることを確認します。
  2. メインウィンドウをダブルクリックします。緑色の子ウィンドウが表示されます。
  3. 緑色の子ウィンドウをクリックして最大化します。
  4. 緑色の子ウィンドウをクリックして復元します。

他の誰かがこの問題を再現できますか?私のシステムでは、緑色の子が復元されますが、プライマリモニターだけでなく、プライマリモニターとセカンダリモニターの両方に描画されます。

App.xaml

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="DualMonitorBug.App"
    StartupUri="Shell.xaml" />

App.xaml.cs

using System.Windows;
namespace DualMonitorBug { public partial class App : Application { } }

Shell.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="DualMonitorBug.Shell"
    Title="Shell" Height="480" Width="640"
    MouseDoubleClick="ShowDialog" />

Shell.xaml.cs

using System.Windows;
using System.Windows.Input;

namespace DualMonitorBug
{
    public partial class Shell : Window
    {
        public Shell()
        {
            InitializeComponent();
        }

        private void ShowDialog(object sender, MouseButtonEventArgs e)
        {
            DialogWindow dialog = new DialogWindow();
            dialog.Owner = this;
            dialog.Show();
        }
    }
}

DialogWindow.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="DualMonitorBug.DialogWindow"
    Title="Dialog Window" Height="240" Width="320"
    AllowsTransparency="True"
    Background="Green"
    MouseLeftButtonDown="ShowHideDialog"
    WindowStyle="None" />

DialogWindow.xaml.cs

using System.Windows;
using System.Windows.Input;

namespace DualMonitorBug
{
    public partial class DialogWindow : Window
    {
        public DialogWindow() { InitializeComponent(); }

        private void ShowHideDialog(object sender, MouseButtonEventArgs e)
        {
           if (e.ClickCount == 1)
           {
               if (this.WindowState == WindowState.Normal)
               {
                   this.DragMove();
               }
           }
           else
           {
               this.WindowState
                   = (this.WindowState == WindowState.Normal)
                   ? WindowState.Maximized
                   : WindowState.Normal;
           }
        }
    }
}
4

3 に答える 3

1

あなたのアプリは私のシステムで正常に動作します。デュアル モニター 3.5SP1 を実行していますが、Radeon HD4670 を使用しています。

于 2010-04-21T15:09:02.947 に答える
0

私も同じ問題を抱えています。デスクトップと拡張モニターを備えたラップトップで試してみたので、これはグラフィックカードの問題ではないと思います。実際のウィンドウを正規化した後、2番目のモニターに余分に最大化されたウィンドウが常に表示されます。ここでグラフィックが関係している場合は、WPF がすべてのグラフィック カードと互換性を持つように設計されていないことに関係していると言えます。

これは、カスタマイズした最大化/最小化ボタンを使用し、ボタン クリック イベントに基づいて WindowState を設定した場合にのみ発生します。Windows のデフォルト ボタンを使用してウィンドウを最大化すると、すべて問題ありません。この問題の解決策を見つけることに不満を感じていたので、ウィンドウ サイズを変更して最大化/正規化するコードを書きました。

于 2010-06-17T18:50:31.253 に答える
0

OK、今日何か試してみましたが、ウィンドウを左上隅に移動する前に、最大化アクティビティが幅を 2 ​​番目のモニターに拡張するために問題が発生したようです。したがって、ウィンドウを正規化すると、拡張部分は 2 番目のモニターに残り、ウィンドウを 2 番目のモニターにドラッグするまでクリアされません。

この問題を回避するには、WindowState を Maximized に設定する前に、最初に Width と Height をゼロに設定します。これで問題は解決します。ウィンドウが正規化されたときに前の位置に戻るように、現在の Top と Left をキャッシュすることができます。

最大化されたコード:

 _oldTop = Top;
_oldHeight = Height;
 Top = Height = 0;
 WindowState = WindowState.Maximized;

正規化されたコード:

Top = _oldTop;
Height = _oldHeight;
WindowState = WindowState.Normal;
于 2010-06-18T16:35:04.563 に答える