4

是否可以检测弹出窗口的最终位置?我有一个在指定 UI 元素下方呈现的自定义弹出窗口,我希望它相对于指定 UI 控件的位置绘制一个边框。默认情况下,行为是好的,这样弹出窗口就绘制在控件下方。
但是,根据弹出行为,如果它遇到屏幕边缘,则弹出将绘制在不同的位置。我的问题是要检测弹出窗口的最终位置是否是,然后将边框分别绘制到其新位置。
或者这是否需要手动过程才能确定弹出窗口是否绘制在与其默认位置不同的位置。

编辑
下面是来自 Git Extensions 的图片,因为您看到没有将“dev”与下拉列表的其余部分分开的行。现在我已经能够愉快地复制这种行为了。然而,弹出窗口有这个简洁的功能,如果遇到屏幕边缘,弹出窗口会相应地移动,这不是我的问题,因为当弹出窗口移动或在另一个点呈现时,我需要选择这个移动并绘制弹出窗口边框适当地。即,如果该选择选项是弹出窗口绘制在开发按钮上方,则弹出窗口的顶部将有一条完整的线,底部将有适当的间隙(抱歉没有图片示例)。有机会我会举个例子。

我希望编辑有帮助:)

在此处输入图像描述

4

1 回答 1

4

好像您正在尝试在弹出窗口周围创建边框

这是一个样本

<Grid>
    <ToggleButton Content="open popup"
                  x:Name="toggle"
                  HorizontalAlignment="Center"
                  VerticalAlignment="Center" />
    <Popup PlacementTarget="{Binding ElementName=toggle}"
           IsOpen="{Binding IsChecked,ElementName=toggle}"
           AllowsTransparency="True">
        <Border Background="White"
                CornerRadius="4"
                BorderBrush="Black"
                BorderThickness="1"
                Padding="5"
                Margin="0,0,10,10">
            <StackPanel>
                <Button Content="somebutton" />
                <RadioButton Content="a radiobutton" />
                <CheckBox Content="a checkbox" />
            </StackPanel>
            <Border.Effect>
                <DropShadowEffect Opacity=".25" />
            </Border.Effect>
        </Border>
    </Popup>
</Grid>

使用这种方法,即使弹出窗口的某些部分超出了应用程序边界,您也可以绘制边框或阴影

结果

弹出

您可以将边框和/或阴影包裹在可重用的样式中以实现重用性

编辑

我试图满足您的要求,还创建了一个可重复使用的模板

<Grid RenderOptions.EdgeMode="Aliased">
    <Grid.Resources>
        <ControlTemplate TargetType="HeaderedContentControl"
                         x:Key="PopupButton">
            <Grid>
                <ToggleButton Content="{TemplateBinding Header}"
                              x:Name="toggle"
                              HorizontalAlignment="Center"
                              VerticalAlignment="Center">
                    <ToggleButton.Template>
                        <ControlTemplate TargetType="ToggleButton">
                            <Border BorderBrush="Gray"
                                    Background="White"
                                    BorderThickness="1"
                                    Padding="4"
                                    x:Name="border">
                                <StackPanel Orientation="Horizontal">
                                    <ContentPresenter />
                                    <TextBlock Text="▼"
                                               Margin="4,0,0,0"
                                               FontSize="8"
                                               VerticalAlignment="Center" />
                                </StackPanel>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsChecked"
                                         Value="True">
                                    <Setter Property="BorderThickness"
                                            TargetName="border"
                                            Value="1,1,1,0" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </ToggleButton.Template>
                </ToggleButton>
                <Popup PlacementTarget="{Binding ElementName=toggle}"
                       IsOpen="{Binding IsChecked,ElementName=toggle}"
                       AllowsTransparency="True">
                    <Grid>
                        <Border Background="White"
                                BorderBrush="Gray"
                                BorderThickness="1"
                                Padding="5"
                                Margin="0,0,5,5">
                            <ContentPresenter />
                            <Border.Effect>
                                <DropShadowEffect Opacity=".25" />
                            </Border.Effect>
                        </Border>
                        <Rectangle Fill="White"
                                   Stroke="Transparent"
                                   StrokeThickness="1"
                                   Width="{Binding ActualWidth,ElementName=toggle}"
                                   Height="3"
                                   Margin=".5,-1,0,0"
                                   HorizontalAlignment="Left"
                                   VerticalAlignment="Top" />
                    </Grid>
                </Popup>
            </Grid>
        </ControlTemplate>
    </Grid.Resources>
    <HeaderedContentControl Header="dev"
                            Template="{StaticResource PopupButton}">
        <StackPanel>
            <Button Content="somebutton" />
            <RadioButton Content="a radiobutton" />
            <CheckBox Content="a checkbox" />
        </StackPanel>
    </HeaderedContentControl>
</Grid>

您可以在资源中定义模板,在应用中为多个项目定义模板

例如

    <HeaderedContentControl Header="header"
                            Template="{StaticResource PopupButton}">
        <!--popup content here-->
    </HeaderedContentControl>

结果

结果

于 2014-06-24T03:05:35.303 回答