Изменение размера ChildWindow на лету в Silverlight вызывает странное поведение - PullRequest
6 голосов
/ 13 ноября 2010

У меня странная проблема при изменении размера родителя холста, который, как оказалось, является ChildWindow.

На высоком уровне это то, что я пытаюсь сделать, когда пользователь нажимает накнопка:

  1. Раскройте строку, установив высоту RowDefinition от 0 до чего-то большего.
  2. Измените размер холста, так как все внутри выше.
  3. Измените размерродительский холст (ChildWindow), так как холст выше.

Шаги 1 и 2 работают нормально.Проблема с шагом 3: когда я перехожу через код F # / Silverlight, все размеры, кажется, установлены правильно.Проблема в том, что ChildWindow отображается на экране как * намного выше, чем на самом деле.

Посмотрите на приведенный ниже пример:

member this.btnWhatever_Click(sender : obj) (args : RoutedEventArgs) =
    let parentWindow = this.Parent :?> ChildWindow // get the canvas' parent, and cast it to a ChildWindow
    // if the RowDefinition height is set to our standard, the hide it by setting it to 0
    if this.aRowDefinition.Height.Value.Equals STANDARD_ROW_HEIGHT then
        this.aRowDefinition.Height <- new GridLength(0.)
        this.Height <- this.Height - HEDGE_ROW_HEIGHT
        parentWindow.Height <- parentWindow.Height - STANDARD_ROW_HEIGHT
        this.btnCreateOrRemoveHedge.Content <- "On"
    // otherwise, unhide the RowDefinition by setting it to the standard height
    else
        this.aRowDefinition.Height <- new GridLength(STANDARD_ROW_HEIGHT)
        this.Height <- this.Height + STANDARD_ROW_HEIGHT
        parentWindow.Height <- parentWindow.Height + STANDARD_ROW_HEIGHT
        this.btnWhatever.Content <- "Off"
    ()

Inв этом случае мой STANDARD_ROW_HEIGHT составляет всего 23 пикселя, и все же пустое пространство в 92 пикселя добавляется в ChildWindow под строкой заголовка после того, как пользователь нажимает кнопку.Более того, когда пользователь снова нажимает кнопку (чтобы переключить видимость строки), строка исчезает, но остается дополнительное место в верхней части окна.Изначально этого пустого места не было.См. Это изображение:

alt text

Любые мысли / помощь будет принята с благодарностью.Спасибо!

1 Ответ

1 голос
/ 13 ноября 2010

Я не эксперт в этом деле, но большая часть рендеринга / определения размера WPF происходит автоматически. Я думаю, что существует двухэтапная модель, в которой сначала запрашиваются компоненты с указанием их предпочтительного размера / ограничений, а затем проходит второй этап с учетом реальных ограничений. Для многих компонентов вам не нужно делать каких-либо явных размеров, потому что они будут автоматически измеряться в зависимости от размеров их дочерних элементов. Похоже, что в целом вы, возможно, осуществляете слишком тонкое / низкоуровневое управление размерами, и вам следует оставить WPF больше работы за вас.

Чтобы скрыть строку, я уверен, что лучше переключить свойство .Visible, чем установить его высоту на ноль.

Пахнет, как будто вы добавляете явную высоту к родителю, но это не нужно, потому что WPF уже собирается изменить размер родительского элемента, поскольку теперь он содержит больше видимого содержимого. Никогда и нигде не устанавливайте высоту родительского объекта, чтобы это исправить.

(Это случайные предложения от не слишком хорошо информированного пользователя WPF, так что удачи :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...