2009-12-09 3 views
18

Я не понимаю, почему это не работает или что мне нужно, чтобы заставить его работать.Создайте элемент WPF за кадром и сделайте растровое изображение

Для Репрографического, создать простое приложение WPF и заменить конструктор константа выглядит главное окно:

public MainWindow() 
    { 
     InitializeComponent(); 

     // simple visual definition 
     var grid = new Grid { Width = 300, Height = 300 }; 
     var text = new TextBlock 
         { 
         Text = "Y DON'T I WORK???", 
         FontSize = 100, 
         FontWeight = 
         FontWeights.Bold 
         }; 
     grid.Children.Add(text); 

     // update the layout so everything is awesome cool 
     grid.Measure(grid.DesiredSize); 
     grid.Arrange(new Rect(grid.DesiredSize)); 
     grid.UpdateLayout(); 

     // create a BitmapSource from the visual 
     var rtb = new RenderTargetBitmap(
            (int)grid.Width, 
            (int)grid.Height, 
            96, 
            96, 
            PixelFormats.Pbgra32); 
     rtb.Render(grid); 

     // Slap it in the window 
     this.Content = new Image { Source = rtb, Width = 300, Height = 300 }; 
    } 

Это приводит к пустому образу. Если я сохраню RTB на диск как PNG, его размер будет правильным, но прозрачным.

Если, однако, я делаю это с визуальным изображением, которое отображается на экране, оно отлично работает.

Как визуализировать визуализацию, которую я построил вне экрана для растрового изображения?

ответ

24

Поскольку элементы не имеют желаемого размера, пока вы их не измеряете. Вы рассказывали Grid о том, чтобы определить размер доступного пространства 0x0. Изменение кода:

grid.Measure(new Size(grid.Width, grid.Height)); 
grid.Arrange(new Rect(new Size(grid.Width, grid.Height))); 

(. Вызов UpdateLayout это ненужный)

+1

сын ........ Я проверил DesiredSize раз путь назад, когда я начал пытаться сделать это и это было не 0,0 (кто знает почему) и никогда не проверял его снова. Благодаря! – Will

+2

Мы только выяснили, что если у вас есть ItemsControls, связанный с их ItemsSources внутри элемента управления, который вы визуализируете на экране, кажется, вам нужно вызвать 'UpdateLayout()' или они не отображают какие-либо элементы. –