16

少し背景として-WindowsにはTouch/TabletPCの機能があり、「利き手」に応じてポップアップ/メニューの位置をシフトします(メニューが手の下に表示されないようにするため)。

基本的に、これが行うのは、「右利き」(タッチデバイスを接続するとデフォルトになるようです)に設定されている場合、開くすべてのポップアップが人為的に左に蹴られます。これにより、レイアウトの問題が発生します。そして、ポップアップを「ポップアップ元」のアイテムと並べます。

タブレットPCの設定が左利きに設定されています-Windowsからの人為的な修正はありません タブレットPCの設定が左利きに設定されています-Windowsからの人為的な修正はありません

タブレットPCの設定を右利きに設定-Windowsが人為的に位置を調整します タブレットPCの設定を右利きに設定-Windowsが人為的に位置を調整します

この設定がSystemParameters.MenuDropAlignmentで設定されていることを検出できます。また、些細なポップアップの場合は、ポップアップの実際の幅を使用してこれを調整できます。ただし、動的ポップアップの場合、および右から左へのサポートをミックスに投入すると、これは正しくありません。仕事。

現在、すべてのポップアップを確認し、手動で値を計算してキックを調整し、次のようなものをすべてに追加する必要がある可能性が高くなっています。

<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>

だから..質問に戻ります:-)この設定を見ているWPFポップアップを停止する方法を知っている人はいますか?

タッチデバイスをお持ちでない場合は、次のコマンドを実行してTabletPCの設定にアクセスできます。

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

そして、それがあなた自身のために作る混乱を見てください:-)

4

5 に答える 5

3

この問題を解決するカスタムポップアップを作成しました。ForceAlignment依存関係プロパティを設定して「Open」メソッドで開くか、「OpenLeft」メソッドと「OpenRight」メソッドを直接呼び出すことができます。

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
于 2013-01-14T17:50:36.710 に答える
2

アプリケーション全体で通常モードに設定します。

FieldInfo fi = typeof(SystemParameters).GetField("_menuDropAlignment",
   BindingFlags.NonPublic | BindingFlags.Static);

fi.SetValue(null, false);
于 2013-03-27T22:30:53.753 に答える
0

SystemParameters.MenuDropAlignment単一の方法で使用されます:

System.Windows.Controls.Primitives.Popup.GetPointCombination()

Popup.Placementこのプライベートメソッドには、次のタイプの値に依存するロジックがありますPlacementMode

public enum PlacementMode
{
    Absolute,
    Relative,
    Bottom,
    Center,
    Right,
    AbsolutePoint,
    RelativePoint,
    Mouse,
    MousePoint,
    Left,
    Top,
    Custom
}

では、が、、、、またはの場合GetPointCombination()にのみチェックされます。どちらか一方を使用できる場合は、チェックの対象にはなりません。MenuDropAlignmentPlacementModeRelativeAbsolutePointRelativePointMousePointPlacementModesMenuDropAlignment

を使用する場合は、ポップアップの座標を提供するために、を有効なメソッドにPlacementMode.Custom設定することもできます。Popup.CustomPopupPlacementCallbackCustomPopupPlacement[]

出典:リフレクター

于 2011-02-17T17:38:47.043 に答える
0

これはかなり古いですが、少なくとも.net 4.5を使用している場合は、別の方法を見つけました。

menuitem /ポップアップテンプレートをオーバーライドすることにより、次のトリガーを使用できます。

<DataTrigger Binding="{Binding Path=(SystemParameters.MenuDropAlignment)}" Value="[True/False]">
    <Setter TargetName="Popup" Property="Placement" Value="[Left/Right]"/>
</DataTrigger>

もちろん、次のように設定します。

  • データトリガー値の正誤問題、
  • セッター値として左または右。

静的クラスからStaticPropertyChangedイベントを使用できるように、バインディングではBinding = {x:static...}ではなくBindingPath =()構文を使用することが重要です。

于 2018-12-28T15:42:01.213 に答える
-1

これは不可能のように思われるので、質問ではMultiDataTriggerを使用して補正します。

于 2011-07-28T10:37:27.620 に答える