Скрытие элемента xaml, но также возможность рендеринга с использованием RenderTargetBitmap в UWP - PullRequest
0 голосов
/ 13 декабря 2018

Я использую RenderTargetBitmap для захвата содержимого элемента управления в XAML.Мне известно об использовании Visibility = "Collapse", которое скрыло бы элемент управления, но когда элемент свернут, тогда RenderTargetBitmap отображает пустое изображение, потому что согласно документам

Содержимое, находящееся в деревено если для параметра Видимость установлено значение Свернуто, оно не будет захвачено.

и

Содержимое, которое не может быть захвачено, будет отображаться как пустое на захваченном изображении, но другоеконтент в том же визуальном дереве все еще может быть захвачен и будет отображаться (присутствие контента, который не может быть захвачен, не сделает недействительным весь захват этой композиции XAML).

Однако я неЯ не хочу отображать его на экране.

Я искал что-то вроде z-index или слоя, поэтому я не отображаю его, но все же могу захватить этот элемент.

В качестве альтернативы другим способом, не использующим RenderTargetBitmap, который визуализирует элемент, даже если для visibility установлено значение collapse

1 Ответ

0 голосов
/ 14 декабря 2018

Вы можете использовать Grid, так как он складывает элементы.Если вы поместите элемент сначала, он будет визуально сложен ниже второго, только если они находятся в той же строке или столбце.В примере ниже RedGrid визуально ниже WhiteGrid .Таким образом, вы не можете визуально увидеть это.Но когда вы используете RenderTargetBitmap для RedGrid , он вернет прямоугольник красного цвета в виде изображения

<Grid >
    <Grid.RowDefinitions>
       <RowDefinition/>
       <RowDefinition/>
    </Grid.RowDefinitions>
        <Grid x:Name="RedGrid" Background="Red" Height="100" Width="100"></Grid>
        <Grid x:Name="WhiteGrid" Background="White" Height="100" Width="100"></Grid>
        <Button Grid.Row="1" Content="Render" Click="Button_Click"></Button>
</Grid>

// C # code

 private async void Button_Click(object sender, RoutedEventArgs e)
        {
            RenderTargetBitmap rtb = new RenderTargetBitmap();
            await rtb.RenderAsync(GridToBeRendered);

            var pixelBuffer = await rtb.GetPixelsAsync();
            var pixels = pixelBuffer.ToArray();
            var displayInformation = DisplayInformation.GetForCurrentView();
            StorageFolder myfolder = ApplicationData.Current.LocalFolder;
            StorageFile file;
            file = await myfolder.CreateFileAsync("Render" + ".png", CreationCollisionOption.GenerateUniqueName);
            if (file != null)
            {
                using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
                    encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                                         BitmapAlphaMode.Premultiplied,
                                         (uint)rtb.PixelWidth,
                                         (uint)rtb.PixelHeight,
                                         displayInformation.RawDpiX,
                                         displayInformation.RawDpiY,
                                         pixels);
                    await encoder.FlushAsync();
                }
            }
            await Launcher.LaunchFileAsync(file);
        }
...