C# 自动重新定位弹出按钮后,调整其位置

C# 自动重新定位弹出按钮后,调整其位置,c#,xaml,uwp,C#,Xaml,Uwp,在这里查看演示 我有一个UWP应用程序,它有一个列表视图,可选择列表项,如图所示。选择项目的右侧将打开一个弹出按钮(不是菜单弹出按钮)。我将弹出按钮的位置指定为底部,并在弹出按钮样式中指定0,-4,0,0的边距。这将产生所需的外观,弹出按钮位于项目的正下方和相邻位置 但是,如果没有足够的空间显示弹出按钮,它将自动移动到顶部的位置。即使我将FlyoutPresenter样式的边距定义为底部边距为-4,它似乎也不会被应用 是否有方法移动弹出按钮?如果可能的话,我不想使用菜单out,因为没有什么是可

在这里查看演示

我有一个UWP应用程序,它有一个
列表视图
,可选择列表项,如图所示。选择项目的右侧将打开一个
弹出按钮
(不是
菜单弹出按钮
)。我将
弹出按钮的
位置
指定为
底部
,并在
弹出按钮
样式中指定
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>


这不是一件好事吗?你宁愿看到飞行被切断?对不起,我不清楚预期的结果。我已经相应地更新了问题。谢谢。成功了。另一个选项是不覆盖控件模板并订阅
打开的
事件,将
弹出按钮
的位置与目标进行比较,如果
弹出按钮
位于目标上方,则以编程方式调整
弹出按钮
的边距。