Создаю новое окно с заранее известной информацией
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 окон в секунду даёт излишнюю нагрузку.
Вы можете в нескольких местах получить необходимые вам значения:
Ну и собственно простенький код:
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 же будет вызван единожды.
Мне кажется это решение поможет вам решить проблему.
Окно в начале, после конструктора, на знает свой истинный размер. Например, если размер окна зависит от размера текста, то до реального рендеринга этого текста размер окна определить нельзя. Так что на время создания окна говорить об истинном размере бессмысленно.
Поэтому вам нужно делать не так. Либо получайте размер на событии Loaded, либо привязываетесь к нему через Binding, чтобы всегда иметь актуальное значение.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости