사용자 지정 시작 화면에서 진행률 표시 줄이 업데이트되지 않음

제임스 맥 더피

그래서 내 응용 프로그램이로드 될 때 증가하는 진행률 표시 줄이있는 시작 화면을 만들려고합니다. 분명히 모든 IP를 제거하기 위해 코드를 편집해야했습니다. 다행스럽게도이 중 대부분은 아무 것도 중요하지 않을만큼 간단합니다. 그러나 어떤 도움이라도 대단히 감사하겠습니다.

실패한 솔루션 1

내 응용 프로그램 블록에 대한 코드는 다음과 같습니다.

public class App : Application
{
   public void Run()
   {
      bool isLoaded = false;

      ProgressSplashScreen splashScreen = new ProgressSplashScreen(() => { isLoaded = true; });
      splashScreen.Show();
      SpinWait.SpinUntil(() => isLoaded);

      _bootStrapper = new BootStrapper(splashScreen);
      _bootStrapper.Run();

      splashScreen.Close();
    }
}

내 스플래시 화면 XAML의 코드는 다음과 같습니다.

<Window x:Class="Application.ProgressSplashScreen"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Splash" BorderBrush="Transparent"
        AllowsTransparency="True" 
        Icon="../../Resources/Icons/Icon.ico"
        WindowStartupLocation="CenterScreen" 
        WindowStyle="None" Width="640" Height="520" 
        Background="Transparent" Name="SplashWindow" Topmost="True" >
   <Grid>
       <StackPanel Orientation="Vertical" VerticalAlignment="Stretch"
                   HorizontalAlignment="Stretch">
            <Image Source="../../Resources/Images/splash.jpg" Height="480" Width="640"/>
            <Grid>
               <ProgressBar Name="SplashProgress" Height="20" Minimum="0" Maximum="100"
                            BorderBrush="Transparent" />
               <Label Name="SplashMessage" VerticalAlignment="Bottom" 
                      HorizontalAlignment="Center"/>
            </Grid>
       </StackPanel>
    </Grid>
</Window>

스플래시 화면 XAML의 코드 비하인드 :

using System;
using System.Threading;
using System.Windows;

namespace Application
{
    public partial class ProgressSplashScreen : Window
    {
        private SynchronizationContext _synchContext;

        public ProgressSplashScreen(Action isLoaded)
        {
            this.Loaded += (sender, args) => isLoaded();
            InitializeComponent();
            _synchContext = SynchronizationContext.Current;
        }

        public void SetProgress(double progress, string message)
        {
            _synchContext.Send((state) =>
            {
                SplashProgress.Value = progress;
                SplashMessage.Content = message;        
            }, null);        
        }
    }
}

마지막으로 업데이트 호출을 시도하는 BootStrapper 클래스 :

namespace Application
{
    internal sealed class BootStrapper : BaseMefBootstrapper
    {
        private ProgressSplashScreen _splash;

        public BootStrapper(ProgressSplashScreen splashScreen)
        {
            _splash = splashScreen;
        }

        public void Run()
        {
           // removed do stuff code here
           _splash.SetProgress(10, "Loading stuff...");
           // removed do stuff code here
           _splash.SetProgress(40, "Loading stuff...");
           // removed do stuff code here
           _splash.SetProgress(80, "Loading stuff...");
           // removed do stuff code here
           _splash.SetProgress(90, "Loading stuff...");
           // removed do stuff code here
           _splash.SetProgress(100, "Loading stuff...");
        }
    }
}

그리고 지금까지 내 화면은 빈 진행률 표시 줄과 함께 거기에 있습니다.

실패한 솔루션 2

추신 ... 나도 해봤 어

using System;
using System.Threading;
using System.Windows;

namespace Application
{
    public partial class ProgressSplashScreen : Window, INotifyPropertyChanged
    {
        private Dispatcher _dispatcher;
        public event PropertyChangedEventHandler PropertyChanged;
        private string _progressMessage;
        private double _progressValue;

        public string ProgressMessage
        {
            get { return _progressMessage; }
            set
            {
                _progressMessage = value;
                OnPropertyChanged("ProgressMessage");
             }
        }

        public double ProgressValue
        {
            get { return _progressValue; }
            set
            {
                _progressValue = value;
                OnPropertyChanged("ProgressValue");
            }
        }

        public ProgressSplashScreen(Action isLoaded)
        {
            this.Loaded += (sender, args) => isLoaded();
            InitializeComponent();
            _dispatcher = Dispatcher.CurrentDispatcher;
        }

        public void SetProgress(double progress, string message)
        {
            _dispatcher.BeginInvoke(new Action(() =>
            {
                ProgressValue = progress;
                ProgressMessage = message;
            }), DispatcherPriority.ContextIdle, null);       
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

이것을 XAML로

<Window x:Class="Application.ProgressSplashScreen"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Splash" BorderBrush="Transparent"
        AllowsTransparency="True" 
        Icon="../../Resources/Icons/Icon.ico"
        WindowStartupLocation="CenterScreen" 
        WindowStyle="None" Width="640" Height="520" 
        Background="Transparent" Name="SplashWindow" Topmost="True" >
   <Grid>
       <StackPanel Orientation="Vertical" VerticalAlignment="Stretch"
                   HorizontalAlignment="Stretch">
            <Image Source="../../Resources/Images/splash.jpg" Height="480" Width="640"/>
            <Grid>

               <ProgressBar Name="SplashProgress" Height="20" Minimum="0" Maximum="100" 
                            BorderBrush="Transparent" Value="{Binding ProgressValue, 
                            UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
            <Label Name="SplashMessage" VerticalAlignment="Bottom" HorizontalAlignment="Center" 
                   Content="{Binding ProgressMessage, 
                   UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
            </Grid>
       </StackPanel>
    </Grid>
</Window>

어떤 도움이라도 좋을 것입니다! 감사! 이게 지금 당장 힘들다는 게 정말 놀랐습니다 ...

Bastien

그래서 내가 말한 것은 :

MainWindow.xaml

<Window x:Class="SplashSxreenExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Splashscreen" 
        WindowStyle="none" ResizeMode="NoResize" ShowInTaskbar="False" WindowStartupLocation="CenterScreen"
        Height="400" Width="700" Background="#FF292929" FontFamily="Century Gothic"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">


    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/SplashScrTemplate.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="AUto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <Label Grid.Row="0" Content="Test Splash Screen" Foreground="LightGray" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="60"/>
        <Label Grid.Row="1" Content="{Binding ProgressMessage}" Foreground="LightGray" FontStyle="Italic"/>
        <ProgressBar Grid.Row="2" Height="3" Foreground="White" Style="{StaticResource FlatProgressBar}"
                     Value="{Binding ProgressValue}"/>

    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;

namespace SplashSxreenExample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged; 
        private string _progressMessage;
        private int _progressValue;
        private BackgroundWorker _mWorker;

        public MainWindow()
        {
            InitializeComponent();
            _mWorker = new BackgroundWorker();
            _mWorker.WorkerReportsProgress = true; //Allow reporting
            _mWorker.ProgressChanged += _mWorker_ProgressChanged;
            _mWorker.DoWork += _mWorker_DoWork;

            _mWorker.RunWorkerAsync();
        }

        void _mWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker wkr = sender as BackgroundWorker;

            wkr.ReportProgress(0, "Starting..."); //Reporting progress
            //Here do your stuff
            Thread.Sleep(500);
            wkr.ReportProgress(10, "Loading stuff...");
            //Here do your stuff
            Thread.Sleep(1000);
            wkr.ReportProgress(40, "Loading stuff 2...");
            //Here do your stuff
            Thread.Sleep(500);
            wkr.ReportProgress(80, "Loading stuff 3...");
            //Here do your stuff
            Thread.Sleep(1500);
            wkr.ReportProgress(90, "Loading stuff 4...");
            //Here do your stuff
            Thread.Sleep(2000);
            wkr.ReportProgress(100, "Finished");
        }

        void _mWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            ProgressValue = e.ProgressPercentage; //Value
            ProgressMessage = e.UserState.ToString(); //Message
        }

        #region Properties
        public string ProgressMessage
        {
            get { return _progressMessage; }
            set
            {
                _progressMessage = value;
                OnPropertyChanged("ProgressMessage");
            }
        }

        public int ProgressValue
        {
            get { return _progressValue; }
            set
            {
                _progressValue = value;
                OnPropertyChanged("ProgressValue");
            }
        }
        #endregion



        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

그리고 리소스 사전 (플랫 바의 경우)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="FlatProgressBar" TargetType="{x:Type ProgressBar}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ProgressBar">
                    <Border BorderBrush="{x:Null}" BorderThickness="0" Background="{x:Null}" CornerRadius="0" Padding="0">
                        <Grid x:Name="PART_Track">
                            <Rectangle x:Name="PART_Indicator" HorizontalAlignment="Left" Fill="{Binding RelativeSource={RelativeSource AncestorType=ProgressBar},Path=Foreground}" />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

이것은 저에게 꽤 잘 작동합니다. 어려움이 있으면 알려주세요.

다음은 결과의 ptrscr입니다.

결과 스냅 샷 나는 그것이 당신을 도울 수 있기를 바랍니다.

BR,

바스 티엔.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

진행률 표시 줄이 페이지에서 업데이트되지 않음

분류에서Dev

WPF UI에서 진행률 표시 줄이 업데이트되지 않음

분류에서Dev

Android에서 진행률 표시 줄이 업데이트되지 않음

분류에서Dev

Primefaces 진행률 표시 줄이 업데이트되지 않음

분류에서Dev

사용자 지정 진행률 표시 줄이 원활하게 업데이트되지 않습니다.

분류에서Dev

Redux 이벤트 후 진행률 표시 줄이 업데이트되지 않음

분류에서Dev

진행률 표시 줄 색상이 값에 따라 업데이트되지 않음

분류에서Dev

진행률 표시 줄이 자바 스크립트 및 부트 스트랩에서 작동하지 않음

분류에서Dev

HTML 페이지에서 진행률 표시 줄이 작동하지 않음

분류에서Dev

해상도와 밀도가 다른 화면에 사용자 지정 진행률 표시 줄이 제대로 맞지 않음

분류에서Dev

Tkinter 진행률 표시 줄이 Windows에서 작동하지 않음

분류에서Dev

Java-진행률 표시 줄이 진행되지 않음

분류에서Dev

비디오 진행률 표시 줄이 전체 화면에서 사라지지 않습니다.

분류에서Dev

Primefaces 진행률 표시 줄이 업데이트되지 않습니까?

분류에서Dev

시맨틱 UI 진행률 표시 줄이 초기화되지 않음

분류에서Dev

Applescript 진행률 표시 줄이 작동하지 않음

분류에서Dev

Android 진행률 표시 줄이 작동하지 않음

분류에서Dev

MATLAB 진행률 표시 줄이 제 시간에 확장되지 않음

분류에서Dev

부트 스트랩 진행률 표시 줄에 진행률이 표시되지 않습니까?

분류에서Dev

SwipeRefreshLayout setRefreshing이 Fragment에 진행률 표시 줄을 표시하지 않음

분류에서Dev

C # 작업 표시 줄 진행률 표시 줄이 Invoke에서 제대로 작동하지 않습니다.

분류에서Dev

목록 내의 진행률 표시 줄이 wpf 응용 프로그램에서 업데이트되지 않습니다.

분류에서Dev

AsyncTask에 진행률 대화 상자가 표시되지 않음

분류에서Dev

진행률 표시 줄 애니메이션이 cygwin에 표시되지 않음, cmd에서 괜찮음

분류에서Dev

API 19에서 진행률 표시 줄이 채워지지 않음

분류에서Dev

부트 스트랩 진행률 표시 줄에 색상이 표시되지 않음

분류에서Dev

Android 사용자 지정 작업 표시 줄이 표시되지 않음

분류에서Dev

로그인 페이지에 표시되지 않는 진행률 표시 줄

분류에서Dev

업데이트 패널 PostBackTrigger, 업데이트 진행률이 표시되지 않음

Related 관련 기사

  1. 1

    진행률 표시 줄이 페이지에서 업데이트되지 않음

  2. 2

    WPF UI에서 진행률 표시 줄이 업데이트되지 않음

  3. 3

    Android에서 진행률 표시 줄이 업데이트되지 않음

  4. 4

    Primefaces 진행률 표시 줄이 업데이트되지 않음

  5. 5

    사용자 지정 진행률 표시 줄이 원활하게 업데이트되지 않습니다.

  6. 6

    Redux 이벤트 후 진행률 표시 줄이 업데이트되지 않음

  7. 7

    진행률 표시 줄 색상이 값에 따라 업데이트되지 않음

  8. 8

    진행률 표시 줄이 자바 스크립트 및 부트 스트랩에서 작동하지 않음

  9. 9

    HTML 페이지에서 진행률 표시 줄이 작동하지 않음

  10. 10

    해상도와 밀도가 다른 화면에 사용자 지정 진행률 표시 줄이 제대로 맞지 않음

  11. 11

    Tkinter 진행률 표시 줄이 Windows에서 작동하지 않음

  12. 12

    Java-진행률 표시 줄이 진행되지 않음

  13. 13

    비디오 진행률 표시 줄이 전체 화면에서 사라지지 않습니다.

  14. 14

    Primefaces 진행률 표시 줄이 업데이트되지 않습니까?

  15. 15

    시맨틱 UI 진행률 표시 줄이 초기화되지 않음

  16. 16

    Applescript 진행률 표시 줄이 작동하지 않음

  17. 17

    Android 진행률 표시 줄이 작동하지 않음

  18. 18

    MATLAB 진행률 표시 줄이 제 시간에 확장되지 않음

  19. 19

    부트 스트랩 진행률 표시 줄에 진행률이 표시되지 않습니까?

  20. 20

    SwipeRefreshLayout setRefreshing이 Fragment에 진행률 표시 줄을 표시하지 않음

  21. 21

    C # 작업 표시 줄 진행률 표시 줄이 Invoke에서 제대로 작동하지 않습니다.

  22. 22

    목록 내의 진행률 표시 줄이 wpf 응용 프로그램에서 업데이트되지 않습니다.

  23. 23

    AsyncTask에 진행률 대화 상자가 표시되지 않음

  24. 24

    진행률 표시 줄 애니메이션이 cygwin에 표시되지 않음, cmd에서 괜찮음

  25. 25

    API 19에서 진행률 표시 줄이 채워지지 않음

  26. 26

    부트 스트랩 진행률 표시 줄에 색상이 표시되지 않음

  27. 27

    Android 사용자 지정 작업 표시 줄이 표시되지 않음

  28. 28

    로그인 페이지에 표시되지 않는 진행률 표시 줄

  29. 29

    업데이트 패널 PostBackTrigger, 업데이트 진행률이 표시되지 않음

뜨겁다태그

보관