2013-02-01 23 views
0

我有一個用戶控制一個網格:WriteableBitmap.Savejpeg不呈現網格文本(圖像是OK)

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneAccentBrush}"> 
    <Image 
     x:Name="imgBack" 
     Opacity=".25" /> 
    <Grid VerticalAlignment="Top" HorizontalAlignment="Left"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 
     <!-- Some textblocks --> 
</Grid> 

圖像的柵格&源的大小是在運行時動態設置:

public void ChangeSizeAndImage(int width, int height, string backImagePath) 
{ 
    // Set the height and width 
    LayoutRoot.Width = width; 
    LayoutRoot.Height = height; 

    // Set the background image 
    imgBack.Source = new BitmapImage(new Uri(backImagePath, UriKind.RelativeOrAbsolute)); 

    this.UpdateLayout(); 
} 

我然後調用從UI元素&其保存到IsolatedStorage(後來加入了Windows Phone動態磁貼)

生成JPEG的方法

我能夠成功地使用瓷磚上的圖像,除了我只看到具有黑色背景的圖像,並且我沒有看到任何文字。我認爲這與jpeg和透明PNG有關,但是,我使用一種顏色在上面的Grid上設置背景,所以我不確定爲什麼它會被認爲是透明的。

編輯1 我以編程方式初始化此用戶控件,設置一些屬性,並將它傳遞給創建圖像方法。我發現,如果我將這個用戶控件添加到一個頁面,然後使用調用創建圖像方法,它工作得很好。必須有一些關於它在頁面上呈現,導致一切正常排列。不幸的是,這種方法在我的情況下是不可能的。我能做些什麼來實現這個目標?控件上的UpdateLayout();不起作用。

回答

1

您正面臨着以背景方式呈現XAML的巨大挑戰。在最終意識到這是什麼之前,我跑過這個相同的問題。更糟糕的是,每隔一段時間它都會工作得很好!

問題是圖像加載的方式。當您創建控件時,會創建Image元素,並將圖像加載/解碼啓動到另一個線程。與此同時,你的線程繼續運行。將控件渲染到一個文件中並保存,稍後(以下是您看不到的部分)圖像完成加載,然後進行實際渲染。太令人沮喪了!

因爲你不知道需要多長時間,所以你不能只在那裏延遲(而且我不確定它會以這種方式工作。你所要做的就是將你的工作分解成多個部分,並訂閱圖像上的ImageOpened事件,當事件觸發時,您可以相信一切正常並保存位圖

在後臺代理中,這是棘手的,因爲您需要拖延在完成之後,您還需要訂閱ImageFailed事件並對其進行處理!

在WP8應用程序中,你應該使用異步/等待模式,使整個流程更容易。在WP7中,你需要自己同步事物。如果您需要,我可以發佈一些代碼。

我希望我有一個更容易的解決方案,但希望這會讓你朝着正確的方向前進!

0

這個工作對我來說:

UserControl myControl = new UserControl(); 
myControl.Arrange(new Rect(0, 0, Width, Height)); 

WriteableBitmap writeable = new WriteableBitmap(Width, Height); 
Writeable.Render(Control, null); 
writeable.Invalidate(); 

IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile("/Shared/ShellContent/" + Filename); 

System.Windows.Media.Imaging.Extensions.SaveJpeg(writeable, fileStream, Width, Height, 0, 100); 
fileStream.Close(); 

希望這有助於。