我们的程序中的应用程序菜单存在问题,具体表现为应用程序菜单在打开时出现在意料之外的位置,这与窗口所在的位置有关。
最初,应用程序菜单会直接在功能区的应用程序菜单按钮下方和左侧打开。我们实施了此问题中概述的解决方案,使应用程序菜单朝我们想要的方向打开(向下和向右)。
不幸的是,这带来了一个副作用。如上所述,当窗口靠近监视器边缘时,应用程序菜单将在意料之外的位置打开,尽管具体情况因屏幕配置而异:
以下是一个简化的应用程序,展示了上述行为。
主窗口:
上述问题中提到的类型转换器:
一张图片胜过千言万语,以下是这个问题的多监视器版本示例。 我们可能做错了什么?
最初,应用程序菜单会直接在功能区的应用程序菜单按钮下方和左侧打开。我们实施了此问题中概述的解决方案,使应用程序菜单朝我们想要的方向打开(向下和向右)。
不幸的是,这带来了一个副作用。如上所述,当窗口靠近监视器边缘时,应用程序菜单将在意料之外的位置打开,尽管具体情况因屏幕配置而异:
- 在单显示器系统上,当窗口与屏幕的右侧对齐时会发生这种情况。
- 在多显示器系统上,当窗口距除最左侧以外的任何屏幕的左侧20像素以内时,就会发生这种情况。
以下是一个简化的应用程序,展示了上述行为。
主窗口:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Custom="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon"
xmlns:Example="clr-namespace:Ribbon_Example"
xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
x:Class="Ribbon_Example.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Ribbon>
<Ribbon.ApplicationMenu>
<RibbonApplicationMenu>
<RibbonApplicationMenu.Resources>
<Example:NegativeIntegerConverter x:Key="NegativeIntegerConverter" />
<Style TargetType="Popup">
<Setter Property="Placement" Value="Left" />
<Setter Property="HorizontalOffset"
Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=RibbonApplicationMenu},
Path=Width,
Converter={StaticResource ResourceKey=NegativeIntegerConverter}}" />
</Style>
</RibbonApplicationMenu.Resources>
<RibbonApplicationMenuItem Header="New..." />
<RibbonApplicationMenuItem Header="Open..." />
<RibbonApplicationMenuItem Header="Close" />
<RibbonApplicationMenuItem Header="Save" />
<RibbonApplicationMenuItem Header="Save As..." />
</RibbonApplicationMenu>
</Ribbon.ApplicationMenu>
</Ribbon>
</Grid>
</Window>
上述问题中提到的类型转换器:
using System;
using System.Globalization;
using System.Windows.Data;
namespace Ribbon_Example
{
class NegativeIntegerConverter : IValueConverter
{
public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
{
return -1 * System.Convert.ToInt32( value );
}
public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
{
return -1 * System.Convert.ToInt32( value );
}
}
}
一张图片胜过千言万语,以下是这个问题的多监视器版本示例。 我们可能做错了什么?
<Setter Property="FlowDirection" Value="LeftToRight"/>
是否有所帮助吗? - netaholicPlacement
设置为Left
时,如果有足够的空间,弹出窗口将尝试出现在父控件的左侧。转换器并不会修复它,它只是将弹出窗口的x坐标移动到父控件的宽度。通过将Placement
设置为Bottom
、Relative
或Right
,您的弹出窗口应该可以正常工作。您能否检查一下是否如此? - netaholic