Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式在WPF应用程序中生成Progressbar_C#_Wpf - Fatal编程技术网

C# 以编程方式在WPF应用程序中生成Progressbar

C# 以编程方式在WPF应用程序中生成Progressbar,c#,wpf,C#,Wpf,在任何.cs文件中,我都可以调用 MessageBox.Show( "This is an example", "Example", MessageBoxButton.OK, MessageBoxImage.Warning ); 这将在当前活动窗口上生成一个messagebox。我正在寻找一种方法来实现类似的行为,但使用ProgressBar 编辑 更具体地说,我知道我可以用 <ProgressBar Minimum="0" Maximum="100" N

在任何
.cs
文件中,我都可以调用

MessageBox.Show(
    "This is an example",
    "Example",
    MessageBoxButton.OK,
    MessageBoxImage.Warning
);
这将在当前活动窗口上生成一个messagebox。我正在寻找一种方法来实现类似的行为,但使用
ProgressBar

编辑

更具体地说,我知道我可以用

<ProgressBar Minimum="0" Maximum="100" Name="pbStatus" IsIndeterminate="True" />

在我的XAML文件中。但这意味着我将它添加到所有将执行任务的窗口中。因此,如果可能的话,我的目标是直接在任务的代码中生成它

编辑


我最终写了一段复杂得多的代码来实现我想要的。我将在另一个问题上引用我的解决方案。查看此图。

不必为您完成整个过程,您可以创建一个窗口,该窗口在活动窗口顶部打开,上面有一个进度条,然后通过事件将进度发送给活动窗口

我刚刚创建了这个进度条:

<Window x:Class="ProgressBar.Views.ProgressBar"
    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"
    mc:Ignorable="d"
    WindowStyle="None"
    Title="ProgressBar" Height="25" Width="250">
<Grid VerticalAlignment="Center">

    <ProgressBar Minimum="0" Maximum="100" Height="25" Value="{Binding Progress}"></ProgressBar>

</Grid>
事件看起来像

 public class ProgressBarEvent
{
    private static ProgressBarEvent _instance;

    public static ProgressBarEvent GetInstance()
    {
        if(_instance == null)
            _instance = new ProgressBarEvent();
        return _instance;
    }

    public EventHandler<int> ProgressChanged;

    public EventHandler Show;
    public EventHandler Close;

    public ProgressBarEvent Start()
    {
        OnShow();
        return this;
    }

    public ProgressBarEvent Stop()
    {
        OnStop();
        return this;
    }

    private void OnShow()
    {
        if (Show is EventHandler show)
        {
            show.Invoke(this, new EventArgs());
        }
    }

    private void OnStop()
    {
        if (Close is EventHandler close)
        {
            close.Invoke(this, new EventArgs());
        }
    }

    public void SendProgress(int progress)
    {
        if (ProgressChanged is EventHandler<int> progressChanged)
        {
            progressChanged.Invoke(this, progress);
        }
    }
}
公共类ProgressBarEvent
{
私有静态ProgressBarEvent_实例;
公共静态ProgressBarEvent GetInstance()
{
if(_instance==null)
_instance=newprogressbarevent();
返回_实例;
}
公共事件处理程序已更改;
公共事件处理程序显示;
公共事件处理程序关闭;
公共ProgressBarEvent启动()
{
OnShow();
归还这个;
}
公共交通站
{
顶部();
归还这个;
}
私有void OnShow()
{
if(Show是EventHandler Show)
{
调用(这个,新的EventArgs());
}
}
私有void OnStop()
{
if(Close是EventHandler Close)
{
Invoke(这是新的EventArgs());
}
}
公共void发送进度(int进度)
{
如果(ProgressChanged是EventHandler ProgressChanged)
{
progressChanged.Invoke(这个,progress);
}
}
}
App.xaml.cs看起来像:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        ProgressBarEvent.GetInstance().Show += ShowProgressBar;
        ProgressBarEvent.GetInstance().Close += CloseProgressBar;
    }

    private Views.ProgressBar progressBarWindow;

    private void CloseProgressBar(object sender, EventArgs e)
    {
        Application.Current.Dispatcher.Invoke(() => progressBarWindow.Close());
    }

    private void ShowProgressBar(object sender, EventArgs e)
    {
        progressBarWindow = new Views.ProgressBar();
        var activeWindow = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.IsActive);
        progressBarWindow.Owner = activeWindow;
        progressBarWindow.Show();
    }
}
    private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        ProgressBarEvent.GetInstance().Start();

        await Task.Run(() =>
        {
            for (int i = 0; i < 100; i++)
            {
                ProgressBarEvent.GetInstance().SendProgress(i);
                Thread.Sleep(100);
            }

            ProgressBarEvent.GetInstance().Stop();
        });

    }
公共部分类应用程序:应用程序
{
启动时受保护的覆盖无效(StartupEventArgs e)
{
基础。启动时(e);
ProgressBarEvent.GetInstance().Show+=ShowProgressBar;
ProgressBarEvent.GetInstance().Close+=CloseProgressBar;
}
private Views.ProgressBar ProgressBar窗口;
私有void CloseProgressBar(对象发送方,事件参数e)
{
Application.Current.Dispatcher.Invoke(()=>progressBarWindow.Close());
}
私有void ShowProgressBar(对象发送方,事件参数e)
{
progressBarWindow=新视图。ProgressBar();
var activeWindow=Application.Current.Windows.OfType().FirstOrDefault(x=>x.IsActive);
progressBarWindow.Owner=activeWindow;
progressBarWindow.Show();
}
}
然后,我在主窗口上创建了一个按钮,其中包含和事件处理程序,如下所示:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        ProgressBarEvent.GetInstance().Show += ShowProgressBar;
        ProgressBarEvent.GetInstance().Close += CloseProgressBar;
    }

    private Views.ProgressBar progressBarWindow;

    private void CloseProgressBar(object sender, EventArgs e)
    {
        Application.Current.Dispatcher.Invoke(() => progressBarWindow.Close());
    }

    private void ShowProgressBar(object sender, EventArgs e)
    {
        progressBarWindow = new Views.ProgressBar();
        var activeWindow = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.IsActive);
        progressBarWindow.Owner = activeWindow;
        progressBarWindow.Show();
    }
}
    private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        ProgressBarEvent.GetInstance().Start();

        await Task.Run(() =>
        {
            for (int i = 0; i < 100; i++)
            {
                ProgressBarEvent.GetInstance().SendProgress(i);
                Thread.Sleep(100);
            }

            ProgressBarEvent.GetInstance().Stop();
        });

    }
private async void按钮base\u OnClick(对象发送方,RoutedEventArgs e)
{
ProgressBarEvent.GetInstance().Start();
等待任务。运行(()=>
{
对于(int i=0;i<100;i++)
{
ProgressBarEvent.GetInstance().SendProgress(i);
睡眠(100);
}
ProgressBarEvent.GetInstance().Stop();
});
}

基本上,这将打开进度条窗口,并在完成后将其关闭。您必须弄清楚如何在要运行进度的窗口上定位进度。

您可以创建一个新窗口,而不是显示
消息框,将其
Content
属性设置为
ProgressBar
,并调用窗口的
Show
ShowDialog
方法,具体取决于您是否希望窗口处于模式:

Window window = new Window();
window.Content = new ProgressBar()
{
    Minimum = 0,
    Maximum = 100, IsIndeterminate = true
};
window.Show();

对于支持率较低的选民,我们非常感谢他们的反馈。1)这不是一个问题。2) 我看不到你的代码,你试过做什么吗?1)如果可能的话,我正在寻找一种不使用xaml生成progressbar的方法。2) 因为我在寻求一种方法,所以我不知道如何提供代码(研究没有尝试过解决方案)。我之所以提出这个问题,是因为MessageBox是一个
窗口
,而ProgressBar是一个
控件
——它需要包含在
窗口中
——既可以是现有的,也可以是新的。@Default似乎合法。我会调查并尝试实施。非常感谢您的时间和努力。实际上我从你的代码中学到了+1太好了!我建议阅读事件和委托,因为它们非常有用:)我链接了一个可以使用异步模式生成进度条的工作代码。在我的问题中。再次感谢您抽出时间。