Я пытаюсь создать динамическую равномерную сетку в wpf, которая изменит количество столбцов в зависимости от ширины элемента управления. Таким образом, по сути, если приложение полноэкранное, тогда отображается 7 столбцов, если приложение изменено на небольшую ширину, тогда должен отображаться только 1 столбец. Я хочу приспособить эти действительно широкие размеры экрана и, если пользователь захочет, убрать приложение в сторону от экрана.
Я показываю карточный вид данных, который в данном случае представляет собой общие данные о сотрудниках с портретным изображением.
Моя первоначальная мысль о том, как решить эту проблему, заключалась в том, чтобы связать свойство width однородной сетки с моделью просмотра и привязать количество столбцов к другому свойству, где get будет функцией для расчета количества столбцов. Но это не сработало, потому что привязки не работают со свойством size, даже в режиме OneWayToSource.
решение, которое я нашел до сих пор, - создать собственный класс UniformGrid и переопределить метод MeasuerOverride. Он работает, за исключением того, что запускается каждый раз при изменении размера экрана, что замедляет работу приложения. И что он не срабатывает, когда вы увеличиваете экран или прикрепляете его к краю экрана.
public class EmployeeUniformGrid : UniformGrid
protected override Size MeasureOverride(Size constraint)
{
Size size = base.MeasureOverride(constraint);
if (size.Width > 1200) this.Columns = 7;
if (size.Width > 400) this.Columns = 2;
return size;
}
}
Итак, реальный вопрос заключается в том, как достигается такая функциональность с помощью MVVM (если возможно) и как сделать так, чтобы она не так сильно замедляла работу приложения?
Не устанавливайте свойство Columns в MeasureOverride. Лучше переопределить OnRenderSizeChanged. Еще лучше использовать WrapPanel.
Причина, по которой я решил не использовать WrapPanel, заключалась в том, чтобы я мог заставить EmployeeCard изменять размер в зависимости от размера экрана пользователя, хотя WrapPanel делает именно то, что я хочу, учитывая, что карты теперь можно каким-то образом сделать динамическими. .





Почему бы просто не использовать
WrapPanel? Убедитесь, что все элементы ячеек имеют одинаковый размер, а остальные автоматически.