在MVVM中单击按钮的位置打开弹出窗口或窗口

时间:2017-08-08 09:42:51

标签: wpf mvvm position

我想在点击按钮时显示一些输入窗口。窗口应放在按钮的正下方(绿色圆圈是按钮,白色是新窗口):

enter image description here

如何获取按钮的位置以在MVVM中设置新窗口的位置?

我在视图中有这样的按钮:

<Button Command="{Binding LoginCommand}"/>

viewmodel中的命令:

private void ExecuteLoginCommand()
{
    var dialog = new UserLogin();
    dialog.ShowDialog();
}

将按钮的位置绑定到VM然后将其发送到新窗口可能是一个解决方案,但它是一个好的吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Button方法检索视图中TransformToAncestor的相对位置:Get Absolute Position of element within the window in wpf

在调用视图模型的命令之前,您可以在视图的代码隐藏或附加行为(https://www.codeproject.com/Articles/28959/Introduction-to-Attached-Behaviors-in-WPF)中执行此操作。

获得坐标后,您可以将这些作为参数传递给命令:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    Point relativePoint = button.TransformToAncestor(this).Transform(new Point(0, 0));

    var vm = DataContext as YourViewModel;
    //pass the Point itself or create a custom class yourself and pass an instance of this one here
    vm.LoginCommand.Execute(relativePoint);
}