Search code examples
wpfxamltouchmulti-touchmultidatatrigger

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


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 appearing under your hand).

Essentially what this does is if you are set to "right handed" (which it seems to default to once you've connected a touch device), every popup you open is artificially kicked to the left - this causes massive layout issues where we try and line up a popup with the item it "popped up from" :

Tablet PC Settings set to Left handed - no artificial correction from Windows Tablet PC Settings set to Left handed - no artificial correction from Windows

Tablet PC Settings set to Right handed - Windows artificially adjusts our positioning Tablet PC Settings set to Right handed - Windows artificially adjusts our positioning

We can detect what this setting is set to with SystemParameters.MenuDropAlignment, and for trivial popups we can adjust this using the actual width of the popup - but for dynamic popups and when we throw right to left support into the mix, this just doesn't work.

Currently it's looking more likely that we are going to have to go through every popup, manually work out a value to adjust the kick, and add something like this to every one:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Source={x:Static SystemParameters.MenuDropAlignment}}" Value="True"/>
        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=FlowDirection}" Value="RightToLeft"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
        <Setter Property="HorizontalOffset" Value="-50"/> <!-- Set to arbitrary value to test -->
    </MultiDataTrigger.Setters>
</MultiDataTrigger>

So.. back to the question :-) Does anyone know of a way to stop a WPF popup looking at this setting at all?

For those that don't have a touch device you can access the Tablet PC settings by running:

C:\Windows\explorer.exe shell:::{80F3F1D5-FECA-45F3-BC32-752C152E456E}

And see the mess it makes for yourself :-)


Solution

  • It would appear this just isn't possible, so we are resorting to the MultiDataTrigger in the question to compensate.