dotnet / wpf

WPF is a .NET Core UI framework for building Windows desktop applications.
MIT License
7.08k stars 1.17k forks source link

Indeterminate progress bar used as BitmapCacheBrush target do not animate #8960

Open mslukebo opened 7 months ago

mslukebo commented 7 months ago

Description

When using a BitmapCacheBrush whose Target is a ProgressBar with Indeterminate="True", the rendered control does not animate.

Reproduction Steps

Create a new WPF project that targets either .NET 7 (net7.0-windows) or .NET 8 (net8.0-windows).

Add the following code to MainWindow.xaml:

<Window x:Class="BlankWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BlankWpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <ProgressBar x:Key="CachedProgressBar" Width="200" Height="10" IsIndeterminate="True" >
            <ProgressBar.CacheMode>
                <BitmapCache SnapsToDevicePixels="True" />
            </ProgressBar.CacheMode>
        </ProgressBar>

        <BitmapCacheBrush x:Key="CachedProgressBarBrush" Target="{StaticResource CachedProgressBar}" />
    </Window.Resources>

    <Grid>
        <Rectangle Fill="{StaticResource CachedProgressBarBrush}" Width="200" Height="10" />
    </Grid>
</Window>

Run the application.

Expected behavior

An animated, indeterminate progress bar should be rendered. This is the behavior on .NET 6.

progress

Actual behavior

A static, completely filled progress bar is rendered:

image

Regression?

This is a regression; it used to work in .NET 6.

Known Workarounds

Instead of using a BitmapCacheBrush, you can use a VisualBrush and assign its Visual property to the progress bar (instead of the BitmapCacheBrush.Target property). This fixes the UI, but obviously is less ideal than using a BitmapCacheBrush.

Impact

My application uses many progress bars that we synchronize and reduce their overhead with by using the bitmap cache. This bug breaks all of those bars.

Configuration

No response

Other information

No response

mslukebo commented 7 months ago

Update: I don't know what changed, but the VisualBrush workaround I shared stopped working, and the bug repros with that now. @Kuldeep-MS and @dipeshmsft can I get an update on this bug? There are now no workarounds to this issue.

GSonofNun commented 1 month ago

We just upgraded our application to .NET 8 from .NET 6 and now we have this problem too. The difference for us is, we were using a second UI thread and a HostVisual to run the progress bar on a second thread, so long running tasks don't make it stutter. Would love for this to get fixed, or to have a workaround.