Изменение размера шрифта в списке или сетке WPF для правильного использования пространства

У меня есть приложение, которое отображает рейтинговые таблицы для спортивных лиг. Эти таблицы в основном представляют собой сетки с различными столбцами, представляющими статистику для каждой команды, такую ​​как сыгранные, выигранные, проигранные матчи, забитые и забитые голы и т. д. Таким образом, таблица лиг имеет одно интересное свойство: для данного соревнования у нас всегда есть одна и та же сумма. рядов (представляющих команды). Поскольку элементы управления WPF не имеют внешнего вида, я, вероятно, мог бы использовать ListBox, ListView, ItemsControl напрямую или даже DataGrid. Не должно иметь большого значения.

Однако я хочу чего-то, чего мне пока не удалось добиться: учитывая размер таблицы (на практике размер окна), ВСЕ команды должны быть видны всегда (без вертикальной прокрутки), все столбцы статистики (как выбранный пользователем) должен быть виден, и размер шрифта должен отражать это, чтобы он был как можно больше, но ни один столбец не становился слишком большим для размещения содержимого.

Я могу легко использовать UniformGrid для достижения части без вертикальной прокрутки. Однако настроить размер шрифта не так просто.

Существует, конечно, ViewBox, который позволяет содержимому каждой ячейки таблицы индивидуально изменять свой размер, чтобы быть максимально большим, но это, возможно, приведет к уродству, поскольку вы получите кучу ячеек с разными размерами.

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

  1. Размер таблицы должен изменяться вместе с окном, при этом все данные всегда должны отображаться без полос прокрутки.

  2. Размер шрифта должен быть установлен на максимально возможный размер, чтобы в каждом столбце каждой строки отображалось все его содержимое.

  3. Все столбцы должны иметь наименьший возможный размер, позволяющий видеть все содержимое, за исключением одного столбца, который использует «*-sizing», чтобы занять оставшееся пространство.

Итак.. Любые умные способы сделать это? :)


person Rune Jacobsen    schedule 11.03.2009    source источник


Ответы (2)


Будет ли это работать для того, что вам нужно сделать дочерним элементом окна ViewBox и поместить в него все содержимое? Я не уверен, что детали того, что вы делаете, заставят это не работать, но вот очень простой пример того, что я предлагаю:

<Window x:Class="ZoomTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1">
    <Viewbox>
        <StackPanel>
            <TextBlock>2</TextBlock>
            <TextBlock>Getting longer</TextBlock>
            <TextBlock>Here is some really long text...</TextBlock>
        </StackPanel>
    </Viewbox>
</Window>

Всегда виден весь контент с максимально возможным размером шрифта. Весь текст масштабируется одинаково.

person Daniel Pratt    schedule 12.03.2009
comment
Вы правы! +1 повреждение мозга для меня, я думал, что окна просмотра внутри отдельных ячеек, но это, конечно, полная чушь. Мне просто нужно разобраться со свойствами Stretch, и я буду свободен дома - спасибо! - person Rune Jacobsen; 13.03.2009

Вероятно, вы можете сделать что-то подобное с размером шрифта. Установите для FontSize выражение привязки, которое привязывается к самому TextBox с помощью пользовательского IValueConverter ({Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource FontSizeConverter}} или что-то в этом роде).

Теперь внутри преобразователя у вас есть ссылка на TextBox, которую вы можете использовать для получения текстового содержимого, размера элемента управления, размера родительского элемента управления (сетки) и т. д. Вы можете использовать эту информацию для рассчитать на лету.

Если вам нужно, чтобы текстовые поля принимали это решение на основе друг друга, вы можете иметь статический обратный вызов на уровне страницы, который вы вызываете из метода Convert, который будет определять, находитесь ли вы все еще в режиме изменения размера, и отслеживать любые другая информация (уже рассчитанный минимальный или максимальный размер шрифта и т. д.). Это сложный процесс, но должно быть несколько способов сделать это. Вы даже можете сначала скрыть текст во всех полях, пройтись по всем текстовым полям, приняв такое решение (минимальный размер шрифта), а затем программно установить размер шрифта и затемнить их.

person Rich    schedule 11.03.2009
comment
Спасибо за ваш ответ - я думаю, что вижу, как я мог бы сделать это таким образом, но ответ Дэниела Пратта решил это без дополнительной работы, поэтому я дал ему принятый ответ. Спасибо! - person Rune Jacobsen; 13.03.2009