我有一个启动单独窗口的命令按钮。我使用MVVM Cross架构,因此窗口通过ViewModel中的命令提供。我这样做的方法是在UI层注册一个显示窗口的服务,然后在命令中解析该服务并显示窗口:
public static void ShowMyWindow()
{
IShowMyWindowService myService = Mvx.Resolve<IShowMyWindowService>();
myService.ShowWindow();
}
然后,在服务中(在UI层中):
public void ShowWindow()
{
Window myWindow = new Window();
myWindow.Content = new MyUserControl();
Application.Current.Dispatcher.Invoke(() =>
{
myWindow.Owner = Application.Current.MainWindow;
// Need to set x, y to the position of the button that invoked the command
myWindow.Left = x;
myWindow.Top = y;
myWindow.ShowDialog();
});
}
我遇到的问题是我想在相对于启动它的命令按钮位置的位置显示新对话框。做了一些研究之后,看起来我需要FrameworkElement.PointToScreen()
方法,虽然我无法确定如何在不打破关注点的情况下访问这些信息。
我是以正确的方式解决这个问题,还是有更简单的方法?如果我是,那么如何通过命令传递框架元素?
答案 0 :(得分:1)
你应该有一个方法/命令,如下:
public static void ShowMyWindow(WindowAbsoluteLocationPosition pos)
{
IShowMyWindowService myService = Mvx.Resolve<IShowMyWindowService>();
myService.ShowWindow(pos);
}
如果这样做,您应该CommandParameter
使用Converter
:
<Button Command="{Binding YourCommand}"
CommandParameter="{Binding ElementName=YourWindow,
Converter={StaticResource yourConverter}}" />
基本上可以将YourWindow
转换为传递给viewModel的正确WindowAbsoluteLocationPosition
(用户定义)结构。注意;您还应该将按钮传递给转换器,以便更好地重复使用&#34;。
答案 1 :(得分:0)
在这种情况下,我建议如下:
使用相同名称创建另一个方法,该方法具有表示父窗口的附加参数:
public void ShowWindow(Window parentWindow)
{
//Access the parentWindow location properties to work out a relative position to show the dialog
}
您还需要使用相同的参数重载服务中的 ShowMyWindow 方法,以调用此新的ShowWindow方法。