【问题标题】:How can I get WPF menus to align like the old win forms menu?如何让 WPF 菜单像旧的 win 表单菜单一样对齐?
【发布时间】:2012-06-28 02:37:46
【问题描述】:

我有一个正在开发的 WPF 应用程序。目前一切都非常简单,因为我还没有实现任何“肉”。使用原型困扰一些用户的一件事是菜单从以前在 win 表单中的方式“倒退”了。

我希望菜单框的左边缘与父菜单中“文件”一词的左边缘对齐。我一直在做一些搜索,但我认为我没有找到正确的关键字。我不确定它是否有任何区别,但我也在使用 Galasoft 的 MVVMLight 库。

我的问题是如何让菜单的左边缘与“文件”文本的左边缘对齐?提前谢谢!

    <Menu Grid.Row="0" Grid.Column="0">
        <MenuItem Header="_File" >
            <MenuItem Header="EnableWatcher" IsCheckable="True" IsChecked="{Binding WatcherEnabled}" />
            <Separator />
            <MenuItem Header="_Exit" />
        </MenuItem>
    </Menu>

编辑:这是 xaml 文件中的所有代码。

    <Window x:Class="DonkeySuite.Watcher.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ViewModel="clr-namespace:DonkeySuite.Watcher.ViewModel"
    Title="MainWindow" Height="350" Width="525" Icon="/DonkeySuite.Watcher;component/BlueFolder.ico">
<Window.DataContext>
    <ViewModel:MainViewModel />
</Window.DataContext>
<!--<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <Command:EventToCommand Command="{Binding SaveSettings}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>-->
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30" />
        <RowDefinition Height="30" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>

    </Grid.ColumnDefinitions>
    <Menu Grid.Row="0" Grid.Column="0">
        <MenuItem Header="_File" >
            <MenuItem Header="EnableWatcher" IsCheckable="True" IsChecked="{Binding WatcherEnabled}" />
            <Separator />
            <MenuItem Header="_Exit" />
        </MenuItem>
    </Menu>

    <Grid Grid.Column="0" Grid.Row="1">
        <Grid.RowDefinitions>

        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="60" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="100" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center">Directory:</TextBlock>
        <TextBox Grid.Column="1" Text="{Binding WatchDirectory, Mode=TwoWay}" VerticalAlignment="Center"></TextBox>
        <Button Grid.Column="2" Content="Browse" Command="{Binding BrowseForDirectory}" Height="24" Margin="5, 0, 15, 0">
        </Button>
    </Grid>
</Grid>

【问题讨论】:

  • 老实说,它应该,并且在您的上述代码 xaml 中没有什么奇怪的东西可以实现这一点。让我觉得周围的 XAML 可能是问题所在,或者是您正在使用的资源字典。另外,当您的应用最大化时会发生这种情况吗?
  • 嘿菲尔。感谢您的评论。我添加了另一个与“_File”处于同一级别的 MenuItem,并且在表单最大化时仍然看到结果。最左边的菜单排列正确,因为它位于可视区域的左边缘。然后第二个项目向左推到第一个项目区域。
  • 很奇怪。我逐字复制了您的代码(当然除了 viewmodel 部分),它的工作方式完全符合您的要求,这就是您想要的方式。我让菜单像您的示例一样出现在左侧的唯一方法是将窗口移到屏幕右侧,这也是我所期望的。您的代码没有任何问题。您是否有机会使用应用程序级资源字典?
  • 不,我没有使用任何其他影响 xaml 的东西。我已经打开了 VS2010,使用 nuGet 来获取 MVVMLite 库。将一些测试数据放在我的MainViewModel 中并写在上面。这才是真正让我发疯的原因。我可以将这个项目从解决方案中复制出来,并在我下班时在屏幕 sn-p 的同一个地方下载。我几乎开始怀疑这是我机器上的设置还是什么。我在工作中问过的大多数人都说上面的代码块应该也能正常工作。
  • 我刚回到家,将我的 bin\Debug 文件夹复制到另一台机器上。下拉菜单在那里工作得很好。我想这是我机器上的某种配置问题。我在电脑上检查了我所有的位置/文化数据,一切似乎都很好。其他一切的菜单都按预期工作(FireFox、Outlook 等)。当我有时间时,我将不得不做更多的挖掘,希望我能在未来发布答案。该死的烦人的“虫子”grumble grumble grumble...

标签: wpf


【解决方案1】:

我终于明白了。我找到了 Microsoft 的链接,解决了我的问题。显然这是因为我的电脑上有一个 Wacom 平板电脑。它与 WPF 完全无关。

http://answers.microsoft.com/en-us/windows/forum/windows_7-desktop/menus-are-being-right-aligned/cb94ff1e-5c3f-4535-944a-ae5632149a0d

如果链接最终消失,这里的详细信息很简单。

Windows键+R调出运行对话框。在打开 行,复制/粘贴以下文本行。

shell:::{80F3F1D5-FECA-45F3-BC32-752C152E456E}

确定

这将启动 Tablet PC 设置 配置对话框(即使 您没有平板电脑)。

选择其他标签。

惯用手部分,勾选惯用左手 选项。

点击确定

【讨论】:

  • 很奇怪,它不会影响所有程序中的所有菜单。所以我从来没有注意到这一点。谢谢!
  • 有人知道如何为每个用户的部署解决这个问题吗?
  • @DavidSavage ~ 在应用启动时,您可以设置此注册表值:HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\MenuDropAlignment。将其设置为0。但是,如果您可以使用 GPO,那将是更好的方法。参考here.
  • 虽然我已经搜索了很多,这个答案实际上解决了它
  • 这真的很有帮助!你拯救了我的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多