繁体   English   中英

C#WPF更新状态栏文本和其他窗口的进度

[英]C# WPF Update Status bar text and progress from another window

我有一个名为“ wpfMenu”的主窗口,带有一个包含文本块和进度条的状态栏。 需要从在“主”窗口(在任何时候仅打开​​一个窗口)启动的单独窗口上运行的方法中更新状态栏。

最好是,我想将最小,最大,进度,文本值传递给一个名为“ statusUpdate”的类以更新进度,但我不知道从哪里开始,并且遇到的任何更新进度条的示例都在运行同一窗口。

这是到目前为止我关于状态栏的代码

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Custom="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon" x:Class="Mx.wpfMenu"
    Title="Mx - Menu" Height="600" Width="1000" Background="#FFF0F0F0" Closed="wpfMenu_Closed">
<Grid>
    <StatusBar x:Name="sbStatus" Height="26" Margin="0,0,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Stretch">
        <StatusBar.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </StatusBar.ItemsPanel>
        <StatusBarItem>
            <TextBlock Name="sbMessage" Text="{Binding statusUpdate.Message}"/>
        </StatusBarItem>
        <StatusBarItem Grid.Column="1">
            <ProgressBar Name="sbProgress" Width="130" Height="18" Minimum="0" Maximum="100" IsIndeterminate="False"/>
        </StatusBarItem>
    </StatusBar>
</Grid>

我班上的代码是

    public class statusUpdate : INotifyPropertyChanged
{
    private string _message;
    public event PropertyChangedEventHandler PropertyChanged;

    public statusUpdate()
    {

    }

    public statusUpdate (string value)
    {
        this._message = value;
    }

    public string Message
    {
        get { return _message; }
        set
        {
            _message = value;
            OnPropertyChanged("Message");
        }
    }

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

有几个步骤可以完成,但在其他地方都有很好的文档记录。 这似乎是一个复杂的过程,但是您将在WPF中一遍又一遍地做。

您将所有设置存储在一个类中是正确的。 但是,此类需要实现INotifyPropertyChanged并在每个属性设置器中引发一个PropertyChanged事件。

using System.ComponentModel;

public class StatusUpdate : INotifyPropertyChanged
{
    private string message;
    public event PropertyChangedEventHandler PropertyChanged;

    public StatusUpdate()
    {
    }

    public string Message
    {
        get { return this.message; }
        set
        {
            this.message = value;
            this.OnPropertyChanged("Message");
        }
    }

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

然后,可以将其设为代码隐藏类的公共属性,并将进度条属性绑定到该属性。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
    }

    public StatusUpdate Status { get; set; } = new StatusUpdate();

    private void PlayCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

    public void PlayCommand_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        this.Status.Message = "Play";
    }

    public void StopCommand_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        this.Status.Message = "Stop";
    }
}

然后,您可以将对同一个类的引用传递给子窗体,当它们设置任何属性时,WPF将捕获该事件并更新GUI。

让我知道您是否找不到这些步骤的示例。

这是XAML的一个版本,其中包含我在上面的示例中使用的绑定和按钮:

<Window x:Class="WpfProgressBar.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:WpfProgressBar"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Window.CommandBindings>
    <CommandBinding Command="Play" Executed="PlayCommand_Executed" CanExecute="PlayCommand_CanExecute" />
    <CommandBinding Command="Stop" Executed="StopCommand_Executed" />
</Window.CommandBindings>
<Grid>
    <StackPanel>
        <Button Content="Play" Command="Play" />
        <Button Content="Stop" Command="Stop" />
    </StackPanel>
    <StatusBar Height="26" Margin="0,0,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Stretch">
        <StatusBar.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </StatusBar.ItemsPanel>
        <StatusBarItem>
            <TextBlock Text="{Binding Status.Message, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, NotifyOnSourceUpdated=True}"/>
        </StatusBarItem>
        <StatusBarItem Grid.Column="1">
            <ProgressBar Width="130" Height="18" Minimum="0" Maximum="100" IsIndeterminate="False"/>
        </StatusBarItem>
    </StatusBar>
</Grid>
</Window>

注意,我通常不会像这样进行命令绑定,但不想陷入添加RelayCommand

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM