C# 自动重新定位弹出按钮后,调整其位置
在这里查看演示 我有一个UWP应用程序,它有一个C# 自动重新定位弹出按钮后,调整其位置,c#,xaml,uwp,C#,Xaml,Uwp,在这里查看演示 我有一个UWP应用程序,它有一个列表视图,可选择列表项,如图所示。选择项目的右侧将打开一个弹出按钮(不是菜单弹出按钮)。我将弹出按钮的位置指定为底部,并在弹出按钮样式中指定0,-4,0,0的边距。这将产生所需的外观,弹出按钮位于项目的正下方和相邻位置 但是,如果没有足够的空间显示弹出按钮,它将自动移动到顶部的位置。即使我将FlyoutPresenter样式的边距定义为底部边距为-4,它似乎也不会被应用 是否有方法移动弹出按钮?如果可能的话,我不想使用菜单out,因为没有什么是可
列表视图
,可选择列表项,如图所示。选择项目的右侧将打开一个弹出按钮
(不是菜单弹出按钮
)。我将弹出按钮的位置
指定为底部
,并在弹出按钮
样式中指定0,-4,0,0
的边距。这将产生所需的外观,弹出按钮位于项目的正下方和相邻位置
但是,如果没有足够的空间显示弹出按钮
,它将自动移动到顶部的位置
。即使我将FlyoutPresenter
样式的边距定义为底部边距为-4,它似乎也不会被应用
是否有方法移动弹出按钮
?如果可能的话,我不想使用菜单out
,因为没有什么是可以选择的。弹出型按钮没有Canvas
附加属性,并且更新Canvas。弹出型按钮最顶端的子项的Top
位置不起作用(我真的没想到它会起作用)
编辑:所需的行为是将弹出按钮出现在顶部的位置中,正如所发生的那样,但是根据放置下列弹出按钮的部分,弹出按钮和目标按钮之间没有空格:
如果屏幕上有空间,弹出按钮将使用首选位置显示。如果没有足够的空间,例如当元素靠近屏幕边缘时,将使用此回退顺序放置弹出按钮
当放置
设置为底部
时,如果没有足够的空间,它将放置在由设计的顶部
但是在弹出型按钮和目标之间没有空间
如果底部没有足够的空间,弹出按钮
放在顶部,此时弹出按钮
的边距
应更改为0,4,0,0
,而不是0,-4,0,0
,以获得与底部相同的效果。但是,您不知道弹出型按钮是放在顶部还是底部,因此,作为一种解决方法,您可以将边距设置为0,-5,0,-5
,用于FlyoutPresenterStyle
控件模板内的边框
元素,以满足您的要求。例如:
<Button
Canvas.Top="600"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Click="Button_Click"
Content="Open flyout">
<Button.Flyout>
<Flyout x:Name="flyout" Placement="Bottom">
<Flyout.FlyoutPresenterStyle>
<Style TargetType="FlyoutPresenter">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="FlyoutPresenter">
<Border
Margin="0,-5,0,-5"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer
x:Name="ScrollViewer"
AutomationProperties.AccessibilityView="Raw"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
<ContentPresenter
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
ContentTransitions="{TemplateBinding ContentTransitions}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Flyout.FlyoutPresenterStyle>
<TextBlock Text="This is some text in a flyout." TextWrapping="Wrap" />
</Flyout>
</Button.Flyout>
</Button>
这不是一件好事吗?你宁愿看到飞行被切断?对不起,我不清楚预期的结果。我已经相应地更新了问题。谢谢。成功了。另一个选项是不覆盖控件模板并订阅打开的
事件,将弹出按钮
的位置与目标进行比较,如果弹出按钮
位于目标上方,则以编程方式调整弹出按钮
的边距。