我是从WinForms来的,第一次自学WPF 我想我首先要在WPF中重新创建一个WinForms应用程序的界面,但我的菜单已经存在问题。
我无法弄清楚为什么WPF应用程序中的菜单从右到左打开,当WinForms应用程序上的菜单从左到右打开时(这就是我想要的):
这是一个几乎没有默认设置的空白项目。这是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>
我错过了什么?
答案 0 :(得分:5)
菜单的打开方式取决于SystemParameters.MenuDropAlignment
属性。如果您为惯用右手的人配置了平板电脑,通常会将其设置为右对齐。
可以在控制面板中为计算机更改设置 - &gt;平板电脑设置 - &gt;指定您使用哪一只手。如果您的控制面板中没有Tablet PC设置,则可以尝试运行shell:::{80F3F1D5-FECA-45F3-BC32-752C152E456E}
。这应该打开Tablet PC设置配置对话框(来源:https://stackoverflow.com/a/25109673/3506292)。您还可以创建一个注册表项来更改此设置。
如果绝对需要,您可以使用this或that个问题的答案来覆盖此行为。
最简单的更改(来自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 构造函数调用这个函数。