Создаю новое окно с заранее известной информацией
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
, чтобы всегда иметь актуальное значение.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Делаю программу для очистки ресурсов пк путем закрытия программ, не внесенных в WhiteListДля наглядности решил добавить иконки приложений к их названиям,...
Всем доброго времени сутокВстал перед вопросом, есть простенькая формула выражающая координату Х графика кривой Циклоида
Есть таблица Rooms и tabcontrolВ таблице Rooms есть Id и Name=Кабинка 1, Кабинка 2 и
В папке Debug имеется папка "Updater", из нее запускается exe и загружает файлы в папку bin/Debug/Updater/temp/, нужно переместить файлы из папки temp в папку /bin/ Подскажите,...