Контроль размера по доступному пространству, а не по содержимомуC#

Место общения программистов C#
Ответить
Anonymous
 Контроль размера по доступному пространству, а не по содержимому

Сообщение Anonymous »

Сейчас у меня возникла проблема с элементами управления, которые могут отображать переменные данные неопределенного размера. Например, TextBox, отображающий длинный путь к файлу, или ListBox, отображающий сообщения об ошибках. Это может иметь отношение к другим элементам управления, но сейчас я борюсь с двумя конкретными.
По сути, я хочу, чтобы эти элементы управления расширялись, чтобы заполнить доступное пространство (растущие и сжимающиеся, если размер самого окна изменяется), но я не хочу, чтобы их содержимое вообще влияло на их размер. Прямо сейчас, когда я использую текстовое поле, если я дам ему текст, превышающий его размер, он расширится, чтобы соответствовать содержимому, и окно станет больше. Это не то, что я хочу.
Одно из решений, которое я придумал, — наследовать новый класс от TextBox (NonBloatingTextBox), переопределив функцию MeasureOverride, но это кажется как неоправданно грубый способ сделать что-то, что, по моему мнению, уже должно быть выполнимо.
Я использую в основном DockPanels, Grids и StackPanels для макета, поэтому я не полагаюсь на фиксированное позиционирование. В некоторых моих окнах я могу изменять размер, но в других я отключаю изменение размера и делаю их SizeToContent. Я бы хотел, чтобы это решение работало в обеих ситуациях.
Существует ли в WPF способ расширения и сжатия элементов управления для заполнения доступного пространства, но не принудительного расширения на основе их содержимого?< /p>

Я пробовал настройки «Горизонтальное/Вертикальное выравнивание = Растягивание» различными способами, но, честно говоря, я даже не знаю, какое влияние эта настройка оказывает на различные макеты. панели, поэтому я даже не знаю, правильно ли я это делаю или нет.
Справочный код для упомянутого мной NonBloatingTextBlock. Кажется, это работало каждый раз, когда я его использовал, но похоже, что это должна быть встроенная функция, а не пустяк.
[DesignTimeVisible(true)]
public class NonBloatingTextBox : TextBox
{
protected override Size MeasureOverride(Size constraint)
{
return MinimumDesiredSize;
}

#region Private static properties
private static Size MinimumDesiredSize { get; set; }
#endregion

#region static constructor
public NonBloatingTextBox()
{
MinimumDesiredSize = base.MeasureOverride(new Size(double.PositiveInfinity, double.PositiveInfinity));
}
#endregion
}

ETA: Вот два снимка экрана, показывающие рассматриваемое поведение. Текст внизу показывает ActualHeight и ActualWidth элемента управления, поэтому вы можете увидеть разницу в ширине между ними. Конкретно я хочу, чтобы второй был такой же ширины, как и первый. Я хочу, чтобы ListBox расширялся на всю ширину доступного пространства, но не хочу, чтобы содержимое принудительно расширяло окно, как сейчас.
Изображение
Изображение

И для справки, вот весь WPF, которым я управляю. Это UserControl, который при отображении размещается как единственное содержимое окна. Единственные настраиваемые элементы управления — это NonBloatingTextBox, который я уже опубликовал, и ControlPadding, который просто наследует от Border и больше ничего не делает, поэтому я могу установить согласованное расстояние между виджетами и контролировать это расстояние с помощью стиля, не испортив внутренние границы, из которых состоят другие элементы управления.




























License Status:


User Name:


Machine Name:


PCID:
















Valid
Invalid





















Recheck License


Save Registration File























Подробнее здесь: https://stackoverflow.com/questions/789 ... t-contents
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»