Высота динамического окна

162
23 марта 2018, 09:56

Создаю новое окно с заранее известной информацией

public partial class Chat: Window {
        public Chat(string name, string message) {
            InitializeComponent();
            this.NameLabel.Content = name;
            this.MessageText.Text = message;
        }
}

Textbox с параметром TextWrapping="Wrap"

У окна задан размер, зависящей от содержимого SizeToContent="Height" ResizeMode="CanResizeWithGrip"

И всё отлично создаётся и подстраивается под размер, однако, когда я создаю объект этого окна, мне нужно сразу узнать его итоговую высоту

Chat notice = new Chat(name, message);
... + notice.Height ...

Но таким кодом я получаю ту высоту, которая была указана стандартной для этого окна. (Высота не успела измениться?)

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

Вопрос: как мне получить сразу изменённое значение высоты?

UPD

Сделал так:

Chat notice = new Chat(name, message);
notice.Loaded += (object sender, System.Windows.RoutedEventArgs e) => {
    ... + notice.Height ...
};

Правда, потом я всё в корне переделал, ибо, оказывается, создание и удаление 10-20 окон в секунду даёт излишнюю нагрузку.

Answer 1

Вы можете в нескольких местах получить необходимые вам значения:

  1. PageLoaded (Происходит, когда страница (или любой элемент) загружена, отрисована и готово к дальнейшему взаимодействию).
  2. SizeChanged (Происходит когда ActualHeight или ActualWidth изменяются).
  3. LayoutUpdate (Происходит когда изменяются элементы внутри базового объекта, на котором отслеживается это событие).

Ну и собственно простенький код:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        TextBlock.Text = "SomeTextSomeTextSomeTextSomeTextSomeTextSomeTextSomeTextSomeTextSomeText";
        Debug.WriteLine(String.Format("MainWindow Size window w={0} h={1}", this.ActualWidth, this.ActualHeight));
        this.Loaded += MainWindow_Loaded;
        this.SizeChanged += MainWindow_SizeChanged;
        this.LayoutUpdated += MainWindow_LayoutUpdated;
    }
    private void MainWindow_LayoutUpdated(object sender, EventArgs e)
    {
        Debug.WriteLine(String.Format("MainWindow_LayoutUpdated Size window w={0} h={1}", this.ActualWidth, this.ActualHeight));
    }
    private void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        Debug.WriteLine(String.Format("MainWindow_SizeChanged Size window w={0} h={1}", this.ActualWidth, this.ActualHeight));
    }
    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine(String.Format("MainWindow_Loaded Size window w={0} h={1}", this.ActualWidth, this.ActualHeight));
    }
}

Не забывайте, что SizeChanged и LayoutUpdate могут часто вызываться. PageLoaded же будет вызван единожды.

Мне кажется это решение поможет вам решить проблему.

Answer 2

Окно в начале, после конструктора, на знает свой истинный размер. Например, если размер окна зависит от размера текста, то до реального рендеринга этого текста размер окна определить нельзя. Так что на время создания окна говорить об истинном размере бессмысленно.

Поэтому вам нужно делать не так. Либо получайте размер на событии Loaded, либо привязываетесь к нему через Binding, чтобы всегда иметь актуальное значение.

READ ALSO
Иконки для списка

Иконки для списка

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

198
Отрисовка циклоиды на ZedGraph/Chart

Отрисовка циклоиды на ZedGraph/Chart

Всем доброго времени сутокВстал перед вопросом, есть простенькая формула выражающая координату Х графика кривой Циклоида

259
datagridview и tabcontrol winforms c#

datagridview и tabcontrol winforms c#

Есть таблица Rooms и tabcontrolВ таблице Rooms есть Id и Name=Кабинка 1, Кабинка 2 и

196
Получить путь до каталога выше

Получить путь до каталога выше

В папке Debug имеется папка "Updater", из нее запускается exe и загружает файлы в папку bin/Debug/Updater/temp/, нужно переместить файлы из папки temp в папку /bin/ Подскажите,...

232