如何在窗口中更新UserControl

时间:2019-03-04 14:49:29

标签: c# wpf

我们有带有下一个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(通过设置BaseDialogdialog.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;
}

但它似乎仅适用于初始实例。

1 个答案:

答案 0 :(得分:2)

首先,您应该真正考虑正确实现MVVM模式。 这将使您的生活更加轻松,也不必在大小更改事件中手动将元素居中,而应使用

设置其所有者和WindowStartupLocation
Window win = new Window();
win.Content = new MyUserControl();
win.Owner = this;
win.WindowStartupLocation = WindowStartupLocation.CenterOwner;

我会考虑使用不同的窗口,而不是在一个窗口中不断更改内容。.但这可能因您的具体情况而异