为什么我的菜单从右到左而不是从左到右?

时间:2016-05-19 14:38:26

标签: wpf

我是从WinForms来的,第一次自学WPF 我想我首先要在WPF中重新创建一个WinForms应用程序的界面,但我的菜单已经存在问题。

我无法弄清楚为什么WPF应用程序中的菜单从右到左打开,当WinForms应用程序上的菜单从左到右打开时(这就是我想要的):

enter image description here

这是一个几乎没有默认设置的空白项目。这是XAML:

<Window x:Class="WpfTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" Height="541.771" Width="828.947" WindowStartupLocation="CenterScreen">
    <DockPanel LastChildFill="False" Margin="0" Background="#FFFDFD9C">
        <Menu x:Name="menu" Height="22" VerticalAlignment="Top" RenderTransformOrigin="1.79,0.076" DockPanel.Dock="Top" Margin="0">
            <MenuItem Header="File">
                <MenuItem Header="New Document"/>
                <MenuItem Header="Open Template"/>
                <MenuItem Header="Open Collateral"/>
                <Separator/>
                <MenuItem Header="Synchronise"/>
                <Separator/>
                <MenuItem Header="Build Document"/>
                <MenuItem Header="Document History">
                    <MenuItem Header="Load Last Document"/>
                </MenuItem>
                <Separator/>
                <MenuItem Header="Settings"/>
                <Separator/>
                <MenuItem Header="Exit"/>
            </MenuItem>
            <MenuItem Header="Help">
                <MenuItem Header="User Guide"/>
                <MenuItem Header="About"/>
            </MenuItem>
        </Menu>
        <Rectangle Fill="#FFB8B8FF" Height="80" VerticalAlignment="Top" DockPanel.Dock="Top" Margin="0"/>
    </DockPanel>
</Window>

我错过了什么?

2 个答案:

答案 0 :(得分:5)

菜单的打开方式取决于SystemParameters.MenuDropAlignment属性。如果您为惯用右手的人配置了平板电脑,通常会将其设置为右对齐。

可以在控制面板中为计算机更改设置 - &gt;平板电脑设置 - &gt;指定您使用哪一只手。如果您的控制面板中没有Tablet PC设置,则可以尝试运行shell:::{80F3F1D5-FECA-45F3-BC32-752C152E456E}。这应该打开Tablet PC设置配置对话框(来源:https://stackoverflow.com/a/25109673/3506292)。您还可以创建一个注册表项来更改此设置。

如果绝对需要,您可以使用thisthat个问题的答案来覆盖此行为。

最简单的更改(来自https://stackoverflow.com/a/22065976/3506292

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);
    }
}

答案 1 :(得分:0)

通过使用@SLA80 的 link 在他们对上述已批准答案的评论中的代码,我能够实施此修复。

在 App.xaml.cs 中,我添加了以下代码:

private static void SetDropDownMenuToBeRightAligned()
    {
        var menuDropAlignmentField = typeof(SystemParameters).GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
        Action setAlignmentValue = () =>
        {
            if (SystemParameters.MenuDropAlignment && menuDropAlignmentField != null) menuDropAlignmentField.SetValue(null, false);
        };

        setAlignmentValue();

        SystemParameters.StaticPropertyChanged += (sender, e) =>
        {
            setAlignmentValue();
        };
    }

我从 App 构造函数调用这个函数。

相关问题