Как перевести пользовательский элемент управления в окно - PullRequest
0 голосов
/ 04 марта 2019

У нас есть BaseDialogView со следующим кодом xaml:

<Window x:Class="Test.BaseDialogView"       
    Height="475"       
    WindowStartupLocation="CenterOwner"       
    SizeToContent="Height"
    ResizeMode="CanResize"
    SizeChanged="Window_SizeChanged">
  <ContentControl Content="{Binding ContentPage}" />
</Window>

BaseDialogViewModel класс:

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();            

Так что в основном один разу вас есть экземпляр BaseDialog, вы просто устанавливаете ContentControl (путем установки dialog.ContentPage и dialog.ContentPage.DataContext).

ActivationView очень прост.Например:

 <UserControl x:Class="Test.ActivationView" d:DesignHeight="400" d:DesignWidth="700" MaxWidth="700">
    <Grid> .... what ever you need
 </UserControl>

Проблема в том, что установлены разные окна UserControls, которые имеют разную ширину и высоту.Когда отображается первый UserControl, он находится в центре главного окна, что нормально.Затем отображается каждый новый userControl, но он не центрируется. Как центрировать окно BaseDialog для каждого пользовательского элемента управления?

Я пробовал это (BaseDialogView):

private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
  Window w = sender as Window;
  this.Top = (Application.Current.MainWindow.Height - w.ActualHeight) / 2;
}

, но не работает нормально (некоторые пользовательские элементы управления все еще не работаютпо центру пикселя).Я также попытался добавить это в BaseDialogView Xaml

<Window .... VerticalAlignment="Center">

, но, похоже, он работает только для начального экземпляра.

1 Ответ

0 голосов
/ 04 марта 2019

Прежде всего, вам стоит подумать о реализации модели MVVM.Это облегчит вашу жизнь, также вместо того, чтобы вручную центрировать элемент в событии изменения размера, вы должны установить его владельца и WindowStartupLocation, используя

Window win = new Window();
win.Content = new MyUserControl();
win.Owner = this;
win.WindowStartupLocation = WindowStartupLocation.CenterOwner;

Вместо того, чтобы иметь одно окно, в котором вы продолжаете изменять контент, который я бы сделалрассмотрите возможность использования разных окон ... но это может отличаться в вашем конкретном случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...