1

我有一個非常簡單的RenderTargetBitmap.RenderAsync重載混淆WebView縮放的情況。所有我MainPage執行是一個web視圖和一個按鈕:RenderTargetBitmap混淆了WebView縮放

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <WebView Source="http://bing.com"></WebView> 
    <Button Content="Render me" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Bottom" 
      Click="ButtonBase_OnClick" /> 
</Grid> 

在後面的代碼有隻有一個簡單的事件處理程序

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    RenderTargetBitmap rtb = new RenderTargetBitmap(); 
    await rtb.RenderAsync(this, 1280, 720); 
} 

這是頁面的樣子RenderAsync呼叫前:

Before RenderAsync

,這是調用後會發生什麼:

After RenderAsync

任何想法爲什麼以及如何防止這種情況?請注意,它只能發生,如果我叫

await rtb.RenderAsync(this, 1280, 720); 

但如果我所說的過載而不縮放

await rtb.RenderAsync(this); 

編輯:由於我收到的第一個答案,我想澄清爲什麼長寬比在這裏不是問題,但僅用於證明實際存在問題的目的。想想下面的場景 - 非常高的DPI屏幕,只需要一個較低分辨率的屏幕截圖 - 即使你用RIGHT比例縮小它,它仍然會弄亂WebView。此外,對於我的情況,之後手動調整屏幕截圖的大小並不是一個選項 - 縮放尺寸的RenderAsync重載要快得多,我真的更喜歡使用該方法。

+1

當然這是一個錯誤,唯一的解決方法是一個小閃爍的東西 MainWebView.Visibility = Visibility.Collapsed; 等待Task.Delay(10); MainWebView.Visibility = Visibility.Visible; –

+0

@JuanPabloGarciaCoello謝謝,你和Pieter都提出了類似的解決方案。 :) –

+0

爲什麼手動調整位圖大小不適合你?如果你從前臺(不是'XamlRenderingBackgroundTask'),你可以使用像Win2D這樣的GPU加速方法來快速完成它。 – r2d2rigo

回答

0

不使用固定值,而是使用VisibleBounds來獲取當前窗口大小。

下面的代碼:

private async void pressMe_Click(object sender, RoutedEventArgs e) 
{ 
    var windowBounds = ApplicationView.GetForCurrentView().VisibleBounds; 
    RenderTargetBitmap rtb = new RenderTargetBitmap(); 
    await rtb.RenderAsync(this, (int)windowBounds.Width, (int)windowBounds.Height); 
} 
+0

是的,我知道這一點,這就是爲什麼我使用隨機大小來證明效果。另一個原因是,如果您嘗試在高DPI屏幕上縮小圖像,也會出現問題。而且,即使結果圖像變得混亂(我期望如果比例錯誤),我也不會期望WebView內容混亂。 –

+0

以爲你正在尋找快速修復。你說的很對,即使縱橫比不匹配,也不應影響視圖。看起來像'RenderAsync()'在渲染它之前縮放視圖本身。 –

1

很奇怪的行爲... 我發現一個很骯髒的解決這個(!)。我基本上隱藏並再次顯示webview(wv)。

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    RenderTargetBitmap rtb = new RenderTargetBitmap(); 
    await rtb.RenderAsync(wv, 1280, 720); 
    wv.Visibility = Visibility.Collapsed; 
    await Task.Delay(100); 
    wv.Visibility = Visibility.Visible; 
} 

我不是該溶液中的WebView閃爍的驕傲,但至少它不是「炸燬」了......

+0

感謝彼得,這確實看起來有所作爲,但不幸的是,對於我的情況,這真的不是一個解決方案。 :(Upvoting,但希望會有其他想法... –

1

這是一個黑客位的太多,但我發現如果通過WebViewBrush設置另一個控件的內容,然後渲染該控件,則源WebView不會得到任何縮放比例。我已經修改您所提供的XAML,所以它看起來是這樣的:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <Border x:Name="Target" Width="1280" Height="720" /> 
    <WebView x:Name="webView" Source="http://bing.com" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></WebView> 

    <Button Content="Render me" Grid.Row="1" 
     HorizontalAlignment="Right" 
     VerticalAlignment="Bottom" 
     Click="ButtonBase_OnClick" /> 

</Grid> 

在你的情況,你應該選擇設置Border控制背後的WebView(但是,改變其Visibility或把它放在外面的窗口邊界,因爲RenderAsync將失敗)。然後,在後面的代碼,設定目標控制的BackgroundWebViewBrush的實例對WebView爲食:

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     WebViewBrush brush = new WebViewBrush(); 
     brush.SetSource(webView); 
     Target.Background = brush; 
     Target.InvalidateMeasure(); 
     Target.InvalidateArrange(); 

     RenderTargetBitmap rtb = new RenderTargetBitmap(); 
     await rtb.RenderAsync(Target, 1280, 720); 
     var pixels = await rtb.GetPixelsAsync(); 
    } 

你會得到你的最終圖像沒有任何問題造成的源WebView(但是,請注意,由於縱橫比不匹配,最終圖像看起來會失真)。然而,這有一些注意事項,最重要的一點是WebView尺寸必須與RenderTargetBitmap中的一個匹配,否則您將獲得空白區域。