我们有带有下一个xaml代码的BaseDialogView:
abortConnect=False
BaseDialogViewModel类:
<Window x:Class="Test.BaseDialogView"
Height="475"
WindowStartupLocation="CenterOwner"
SizeToContent="Height"
ResizeMode="CanResize"
SizeChanged="Window_SizeChanged">
<ContentControl Content="{Binding ContentPage}" />
</Window>
用法很简单:
public class BaseDialogViewModel : AbstractNotifyPropertyChangedItem
{
private UserControl contentPage;
public UserControl ContentPage
{
get { return this.contentPage; }
set
{
if (this.contentPage != value)
{
this.contentPage = value;
this.RaisePropertyChanged(() => this.ContentPage);
}
}
}
}
因此,基本上,一旦有了BaseDialog dialog = new BaseDialog();
BaseDialogViewModel dialogVm = new BaseDialogViewModel();
dialog.Owner = Application.Current.MainWindow;
dialog.DataContext = dialogVm ;
dialogVm.ContentPage = new ActivationView();
dialogVm.ContentPage.DataContext = new ActivationViewModel();
的实例,就可以设置ContentControl(通过设置BaseDialog
和dialog.ContentPage
)。
ActivationView非常简单。例如:
dialog.ContentPage.DataContext
问题是设置了不同的 <UserControl x:Class="Test.ActivationView" d:DesignHeight="400" d:DesignWidth="700" MaxWidth="700">
<Grid> .... what ever you need
</UserControl>
窗口,这些窗口具有不同的宽度和高度。当显示第一个UserControl时,它位于MainWindow的中央,可以。然后会显示每个新的userControl,但它们不会居中。 如何将每个用户控件的BaseDialog窗口居中?
我尝试了这个(BaseDialogView):
UserControls
,但不能正常工作(某些用户控件仍未以像素为中心)。我也尝试将其添加到BaseDialogView Xaml
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
Window w = sender as Window;
this.Top = (Application.Current.MainWindow.Height - w.ActualHeight) / 2;
}
但它似乎仅适用于初始实例。
答案 0 :(得分:2)
首先,您应该真正考虑正确实现MVVM模式。 这将使您的生活更加轻松,也不必在大小更改事件中手动将元素居中,而应使用
设置其所有者和WindowStartupLocationWindow win = new Window();
win.Content = new MyUserControl();
win.Owner = this;
win.WindowStartupLocation = WindowStartupLocation.CenterOwner;
我会考虑使用不同的窗口,而不是在一个窗口中不断更改内容。.但这可能因您的具体情况而异