В моем приложении у нас есть представление, содержащее несколько вложенных представлений, для обеспечения некоторых общих функций, т. Е.
В этом случае:
ErrorPanelView (UserControl) с основной ячейкой сетки размера * и ячейкой фиксированной ширины, которая содержит панель сообщений проверки (если проверка не удалась) - эта панель имеет фиксированную ширину и при необходимости отображается или сворачивается .
Основное содержимое снова содержит ButtonPanelView с ячейкой сетки размера * и ячейкой фиксированной высоты, в которой содержатся стандартные кнопки (ок, отмена и т. Д.)
Основное содержимое затем содержит «фактическое» представление - оно может иметь значения min / maxHeight и min / maxWidth, для этого примера значения min / max одинаковы, поэтому размер является статическим.
Когда представление имеет ошибку проверки, и панель validationPanel становится видимой. Общий вид изменится (увеличится по ширине), как и положено, так что пока все хорошо. Однако, когда ошибки проверки обрабатываются пользователем, панель проверки должна исчезнуть, а размер окна должен уменьшиться до его первоначального размера. Что происходит, так это то, что внутренние представления изменят размер правильно (так кажется, по крайней мере), но внешнее представление (пользовательский контроль ErrorPanelView) сохранит свои большие размеры и оставит черное поле, где панель проверки была видна ранее.
В тот момент, когда пользователь нажимает на usercontrol, userControl привязывается к своему предполагаемому (оригинальному) размеру.
Я не могу понять, чего мне здесь не хватает.
Насколько я могу судить, размеры рассчитаны правильно, а высота и ширина UserControl установлены на правильные значения, но что-то не так с последовательностью? - или я должен явно вызвать какой-то systemEvent?
или что-то еще совсем ??
Я в тупике.
private static void CalculateWindowSize(BaseWindow window, List<View> views, bool adjustCurrentSize)
{
// Calculate the extra space the window consumes.
View topView = views.First();
double heightDiff = window.ActualHeight - topView.ActualHeight;
double widthDiff = window.ActualWidth - topView.ActualWidth;
double ww = window.Width; //
double tvw = topView.Width;
const double zeroTolerance = 0.6;
double maxHeightMax = 0, maxWidthMax = 0;
double maxHeightSum = 0, maxWidthSum = 0;
double minHeightMax = 0, minWidthMax = 0;
double minHeightSum = 0, minWidthSum = 0;
double heightSum = 0, widthSum = 0;
double heightMax = 0, widthMax = 0;
foreach (View view in views)
{
ViewSizeBehaviour viewHeightBehaviour = GetHeightSizeBehaviour(view);
ViewSizeBehaviour viewWidthBehaviour = GetWidthSizeBehaviour(view);
switch (viewHeightBehaviour)
{
case ViewSizeBehaviour.Sum:
{
if (!double.IsInfinity(view.MaxHeight)) maxHeightSum += view.MaxHeight;
if (Math.Abs(view.MinHeight) > zeroTolerance) minHeightSum += view.MinHeight;
// Default to MinHeight if WindowHeight not defined
if (!double.IsNaN(view.WindowHeight)) heightSum += view.WindowHeight;
else heightSum += view.MinHeight;
break;
}
case ViewSizeBehaviour.Max:
{
if (!double.IsInfinity(view.MaxHeight)) maxHeightMax = Math.Max(maxHeightMax, view.MaxHeight);
if (Math.Abs(view.MinHeight) > zeroTolerance) minHeightMax = Math.Max(minHeightMax, view.MinHeight);
// Default to MinHeight if WindowHeight not defined
heightMax = Math.Max(heightMax, !double.IsNaN(view.WindowHeight) ? view.WindowHeight : view.MinHeight);
break;
}
}
switch (viewWidthBehaviour)
{
case ViewSizeBehaviour.Sum:
{
if (!double.IsInfinity(view.MaxWidth)) maxWidthSum += view.MaxWidth;
if (Math.Abs(view.MinWidth) > zeroTolerance) minWidthSum += view.MinWidth;
// Default to MinWidth if WindowWidth not defined
if (!double.IsNaN(view.WindowWidth)) widthSum += view.WindowWidth;
else widthSum += view.MinWidth;
break;
}
case ViewSizeBehaviour.Max:
{
if (!double.IsInfinity(view.MaxWidth)) maxWidthMax = Math.Max(maxWidthMax, view.MaxHeight);
if (Math.Abs(view.MinWidth) > zeroTolerance) minWidthMax = Math.Max(minWidthMax, view.MinWidth);
// Default to MinWidth if WindowWidth not defined
widthMax = Math.Max(widthMax, !double.IsNaN(view.WindowWidth) ? view.WindowWidth : view.MinWidth);
break;
}
}
}
if (adjustCurrentSize)
{
window.Height = Math.Max(heightSum, heightMax) + heightDiff;
window.Width = Math.Max(widthSum, widthMax) + widthDiff;
}
// Only set maximum height & width if they are greater than zero. Otherwise all views have specified Infinity as max height
double maxHeight = Math.Max(maxHeightSum, maxHeightMax);
double maxWidth = Math.Max(maxWidthSum, maxWidthMax);
if (Math.Abs(maxHeight) > zeroTolerance)
{
window.MaxHeight = maxHeight + heightDiff;
if (window.MaxHeight < window.Height || window.MaxHeight < window.ActualHeight)
{
window.Height = window.MaxHeight;
}
}
if (Math.Abs(maxWidth) > zeroTolerance)
{
window.MaxWidth = maxWidth + widthDiff;
if (window.MaxWidth < window.Width || window.MaxWidth < window.ActualWidth)
{
window.Width = window.MaxWidth;
}
}
// Minimum height & width are the maximum of either the sum or max calculations
window.MinHeight = Math.Max(minHeightSum, minHeightMax) + heightDiff;
window.MinWidth = Math.Max(minWidthSum, minWidthMax) + widthDiff;