18

PC を Windows 7 から Windows 8 に移動したところ、WPF アプリケーションを実行しているときに、WPF ポップアップやツール ヒントがデフォルトで通常の右下ではなく左下にあることに気付きました。誰もこれに気づきましたか?xaml の各ツールヒントでそれらの場所を指定できることは知っていますが、多くのツール ヒントとポップアップがあります。WPF アプリでデフォルトの場所をグローバルに指定する方法があるかどうかを知りたいです。Google は、この件に関して多くの結果を出していません。それらを同じ元のデフォルト位置に保持する理由があります (一部のポップアップには、開始位置に関連するコンテンツがあります)。

Windows 8: (左下)

Win8 のツール ヒント

Windows 7: (右下)

Win7 のツール ヒント

同じコード!標準の「ツールチップ」xaml 属性。

何か案は?

解決し、コメントを投稿しました


わかりました、私は問題を見つけました。これは、タブレット PC/タッチスクリーンに関係しています。(左利き..右利きの好み)この他のリンクは理由を提供しました。現在、これを解決するためのソリューションに取り組んでいます。詳細は近日アップします!

Windows 8 ポップアップの場所

4

3 に答える 3

1

システム全体でこの動作を変更するソリューションを使用できない場合は、単一のポップアップに対して行う方法を次に示します。

public enum HorizontalPlacement { Left, Right, Center };

public enum VerticalPlacement { Top, Bottom, Center };

/// <summary>
/// In WPF, PopUps pop up in different places on different machines (due to different "handedness" on touch-enabled screens.  This fixes it.
/// See Also: http://social.msdn.microsoft.com/Forums/vstudio/en-US/19ef3d33-01e5-45c5-a845-d64f9231001c/popup-positioningalignments?forum=wpf
/// </summary>
public static class PopupPlacement
{
    /// <summary>
    /// Usage: In XAML, add the following to your tooltip: 
    ///     Placement="Custom" CustomPopupPlacementCallback="CustomPopupPlacementCallback" 
    /// and call this method from the CustomPopupPlacementCallback.
    /// </summary>
    public static CustomPopupPlacement[] PlacePopup(Size popupSize, Size targetSize, Point offset, VerticalPlacement verticalPlacement, HorizontalPlacement horizontalPlacement)
    {
        Point p = new Point
        {
            X = GetHorizontalOffset(popupSize, targetSize, horizontalPlacement),
            Y = GetVerticalOffset(popupSize, targetSize, verticalPlacement)
        };

        return new[]
        {
            new CustomPopupPlacement(p, PopupPrimaryAxis.Horizontal)
        };
    }

    private static double GetVerticalOffset(Size popupSize, Size targetSize, VerticalPlacement verticalPlacement)
    {
        switch (verticalPlacement)
        {
            case VerticalPlacement.Top:
                return -popupSize.Height;
            case VerticalPlacement.Bottom:
                return targetSize.Height;
            case VerticalPlacement.Center:
                return -(popupSize.Height/ 2) + targetSize.Height / 2;
        }

        throw new ArgumentOutOfRangeException("verticalPlacement");
    }

    private static double GetHorizontalOffset(Size popupSize, Size targetSize, HorizontalPlacement horizontalPlacement)
    {
        switch (horizontalPlacement)
        {
            case HorizontalPlacement.Left:
                return -popupSize.Width;
            case HorizontalPlacement.Right:
                return 0;
            case HorizontalPlacement.Center:
                return -(popupSize.Width / 2) + targetSize.Width / 2;
        }
        throw new ArgumentOutOfRangeException("horizontalPlacement");
    }
}
于 2015-03-05T14:33:53.453 に答える