wpf 将PopUp放置在鼠标光标位置的顶部

ttcibm8c  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(143)

我正在处理一个交互式图表,当用户点击一个数据点时,我会显示一个包含更多信息的弹出窗口。到目前为止,这个方法运行良好,弹出窗口的定义如下:

<Popup IsOpen="{Binding PopupViewModel.IsOpen}"
        Placement="Mouse"
        HorizontalOffset="-150">
    <Popup.Resources>
        <DataTemplate DataType="{x:Type ViewModels:DataPointPopUpContentViewModel}">
            <Views:DataPointPopUpContentView/>
        </DataTemplate>
    </Popup.Resources>
    <Border BorderThickness="1" BorderBrush="Black" Background="White">
        <ContentPresenter Content="{Binding PopupViewModel}" />
    </Border>
</Popup>

当使用Placement="Mouse"时,弹出窗口的默认位置是鼠标光标的右下角。但是我希望弹出窗口正好位于鼠标光标的上边缘。正如你所看到的,我已经通过设置HorizontalOffset="-150"实现了水平居中,这是固定的弹出窗口宽度(宽度=300)。对于垂直放置,我有一个问题,弹出高度不固定,因为我在其中显示了一个可变大小和纵横比的图像。因此,我试图通过添加VerticalOffset="{Binding ActualHeight}"来将VerticalOffset设置为pupup的ActualHeight。不幸的是,这并不起作用。关于我做错了什么以及如何实现我的目标,有什么想法吗?

jhkqcmku

jhkqcmku1#

首先你需要一个转换器:

public class MultiplyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double && parameter is double)
        {
            return ((double)value) * ((double)parameter);
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

然后尝试将VerticalOffset属性绑定到Popup子级的ActualHeight

<Window.Resources>
    <local:MultiplyConverter x:Key="MultiplyConverter" />
    <sys:Double x:Key="Factor">-.5</sys:Double>
</Window.Resources>

<Popup IsOpen="{Binding PopupViewModel.IsOpen}"
        Placement="Mouse"
        HorizontalOffset="-150">
    <Popup.VerticalOffset>
        <Binding Path="Child.ActualHeight" RelativeSource="{RelativeSource Self}"
                    Converter="{StaticResource MultiplyConverter}" ConverterParameter="{StaticResource Factor}" />
    </Popup.VerticalOffset>

    <!-- popup content -->
</Popup>

我希望它能帮助你。

相关问题