Is it possible to get a popup to ignore MenuDropAlignment in a WPF / Touch app?

前端 未结 5 2143
终归单人心
终归单人心 2021-02-04 05:26

As a bit of background - Windows has a facility for Touch/TabletPCs whereby it shifts the position of popups/menus depending on your \"handedness\" (to prevent the menu appearin

5条回答
  •  天命终不由人
    2021-02-04 06:22

    I wrote a custom popup that solve this problem: you can set the ForceAlignment dependency property and open it with the "Open" method, or you can directly call "OpenLeft" and "OpenRight" methods.

    Public Class CustomPopup
    
    Inherits Primitives.Popup
    Private Shared moFI As Reflection.FieldInfo = GetType(SystemParameters).GetField("_menuDropAlignment", Reflection.BindingFlags.NonPublic + Reflection.BindingFlags.Static)
    
    Public Enum enuForceAlignment
        None = 0
        Left
        Right
    End Enum
    
    Public Property ForceAlignment As enuForceAlignment
        Get
            Return GetValue(ForceAlignmentProperty)
        End Get
    
        Set(ByVal value As enuForceAlignment)
            SetValue(ForceAlignmentProperty, value)
        End Set
    End Property
    Public Shared ReadOnly ForceAlignmentProperty As DependencyProperty = _
                           DependencyProperty.Register("ForceAlignment", _
                           GetType(enuForceAlignment), GetType(CustomPopup), _
                           New FrameworkPropertyMetadata(enuForceAlignment.None))
    
    Public Sub Open()
        Select Case ForceAlignment
            Case enuForceAlignment.Left
                OpenLeft()
            Case enuForceAlignment.Right
                OpenRight()
            Case Else
                IsOpen = True
        End Select
    End Sub
    Public Sub OpenRight()
        _Open(False)
    End Sub
    Public Sub OpenLeft()
        _Open(True)
    End Sub
    Private Sub _Open(paMenuDropAlignment As Boolean)
        If SystemParameters.MenuDropAlignment <> paMenuDropAlignment Then
            moFI.SetValue(Nothing, paMenuDropAlignment)
            IsOpen = True
            moFI.SetValue(Nothing, Not paMenuDropAlignment)
        Else
            IsOpen = True
        End If
    End Sub
    End Class
    

提交回复
热议问题