Dot-Net

帶有彈出視窗的 WPF 慣用手

  • August 7, 2013

我剛剛將我的 PC 從 Windows 7 移動到 Windows 8,在執行我們的 WPF 應用程序時,我注意到我們的 WPF 彈出視窗和/或工具提示現在預設位於左下角,而不是正常的右下角。有沒有人注意到這一點?我知道您可以在 xaml 中的每個工具提示上指定它們的位置,但是我們有很多工具提示和彈出視窗。我想知道是否有辦法在 WPF 應用程序中全域指定預設位置。Google在這個主題上沒有產生很多結果。我們有理由將它們保持在相同的原始預設位置(一些彈出視窗的內容相對於它們的啟動位置)。

Windows 8:(左下)

Win8 工具提示

Windows 7:(右下)

Win7上的工具提示

相同的程式碼!標準“工具提示”xaml 屬性。

有任何想法嗎?

解決了,我發表了評論


好的,我找到了問題所在。它與平板電腦/觸摸屏有關。(左撇子.. 右撇子偏好)這個其他連結提供了一個原因。我現在正在研究解決此問題的解決方案。我會盡快發布詳細資訊!

windows 8彈出位置

感謝@TravisWhidden 的解決方案。剛剛實現了一個監聽StaticPropertyChanged事件的改進版本,我將它粘貼在這裡,因為它看起來不那麼“黑客”。

private static readonly FieldInfo _menuDropAlignmentField;
static MainWindow()
{
   _menuDropAlignmentField = typeof(SystemParameters).GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
   System.Diagnostics.Debug.Assert(_menuDropAlignmentField != null);

   EnsureStandardPopupAlignment();
   SystemParameters.StaticPropertyChanged += SystemParameters_StaticPropertyChanged;
}

private static void SystemParameters_StaticPropertyChanged(object sender, PropertyChangedEventArgs e)
{
   EnsureStandardPopupAlignment();
}

private static void EnsureStandardPopupAlignment()
{
   if (SystemParameters.MenuDropAlignment && _menuDropAlignmentField != null)
   {
       _menuDropAlignmentField.SetValue(null, false);
   }
}

引用自:https://stackoverflow.com/questions/18113597