2016-07-10 6 views
-2

Я столкнулся с нечетной ошибкой около месяца.Исчезновение элементов управления WPF после «Упорядочить» с размером бесконечности

У меня есть форма, которая выглядит следующим образом:

enter image description here

Когда я нажимаю на Сохр.картинку:

 var g = new Grid(); 
     var mv = new MyControl(); 
     g.Children.Add(mv); 
     g.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
     g.Arrange(new Rect(g.DesiredSize)); 

     var rtb = new RenderTargetBitmap((int)g.ActualWidth, (int)g.ActualHeight, 
      96, 96, PixelFormats.Pbgra32); 
     rtb.Render(g); 

Вызов Measure() и Arrange() устанавливает размер сетки с правильным размером (получено от MyControl) Управление формой и пользовательское управление, отображаемое на RenderTargetBitmap, не имеют общих данных.

Визуальные изображения, которые становятся скрытыми, есть, и данные в виде viewmodel заполняются должным образом.

После выполнения этого кода и снова показывает диалоговое окно выглядит следующим образом:

enter image description here

Оба флажков имеют disappeared.Why ?!

Эта проблема не появляется, если я установить размер сетки (var g в коде)

 var g = new Grid() 
     { 
      Width = 1024, 
      Height = 768 
     }; 
+0

@flag для закрытия..Что не ясно в моем вопросе? – Hristo

+0

Вы сами сказали ответ. При создании новой сетки вы должны указать «Ширина» и «Высота», иначе добавить новый элемент управления в существующую сетку. – ViVi

+0

@ViVi Но я называю Measure() и Arrange .. – Hristo

ответ

0

по умолчанию RowDefinition и ColumnDefinition для Grid является 1*. Это означает, что содержимое предоставлено, однако, много места, которое имеет Grid. В этом случае Grid попросит своего родителя предоставить ему максимальный объем свободного пространства для себя.

В вашем случае, поскольку ваш Grid не имеет визуального родителя, он не знает, насколько большой он должен отображать себя. Вы должны дать ему явную ширину/высоту. Если вы хотите преобразовать содержимое MyControl в Bitmap, почему бы просто не сделать это без Grid?

Если вы настаиваете на использовании Grid, и размер динамический, тогда вы должны вручную указать RowDefinitions и ColumnDefinitions. Измените их оба на auto, что заставит сетку размерность размеров.

+0

Элемент управления дает правильный размер сетью, когда мы вызываем MEasure() и Arrange(). Я могу подтвердить, что размер сетки во время выполнения не является Nan, а созданное изображение является правильным. – Hristo

+0

@Chris Затем вам нужно предоставить больше кодов. До сих пор мы не можем видеть, какая связь между RenderTargetBitmap и вашим UserControl. Кроме того, вам нужно быть более конкретным, что означает «открытие снова». – Jai

+0

Нет никакой связи между формой и отображаемым пользовательским элементом управления. Infact меняет только те 2 свойства: ширина и высота - разница между двумя результатами, которые я изобразил с изображениями. – Hristo

0

Как было сказано на MSDN info about Measure (Remarks section):

Вычисление позиционирования макета в Windows Presentation Foundation (WPF ) состоит из Measure вызова и организовать вызов. Во время вызова измерения элемент определяет его требования к размеру, используя входной вход . Во время вызова Arrange размер элемента завершен.

availableSize может быть любым числом от нуля до бесконечного. Элементы участие в макете должно вернуть минимальный размер, который им нужен для данного доступного размера.

Когда макет сначала создается, он всегда принимает вызов измерения перед организацией.Однако после первого прохода макета он может получить вызов Arrange без Мера; это может произойти, когда изменяется свойство , которое влияет только на Arrange (например, выравнивание), или когда родитель получает Arrange без меры. Вызов «Измерение» будет автоматически аннулировать вызов «Упорядочить».

Обновления макета происходят asynchronously, так что основная нить не ждет изменения всех возможных макетов. Запрос элемента с помощью проверка значений свойств может не сразу отражать изменения свойств, которые взаимодействуют с размером или макетом (например, свойство Width).

Обновления макета можно принудительно использовать с помощью метода UpdateLayout. Однако вызов этого метода обычно не нужен и может привести к снижению производительности .

Следовательно, позвоните по телефону g.UpdateLayout в свой файл с фотографией.

var g = new Grid(); 
var mv = new MyControl(); 
g.Children.Add(mv); 
g.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
g.Arrange(new Rect(g.DesiredSize)); 
g.UpdateLayout(); 

var rtb = new RenderTargetBitmap((int)g.ActualWidth, (int)g.ActualHeight, 
    96, 96, PixelFormats.Pbgra32); 
rtb.Render(g); 
+0

Это выглядит интересно, хотя это не решает мою проблему (флажки все еще отсутствуют). – Hristo

+0

Требовать больше кода для анализа вашей проблемы. Или сравните первый сценарий xaml сценария с кодом щелчка кнопки изображения. Некоторое свойство, которое вы, возможно, пропустили, полагаю. – ViVi

Смежные вопросы