Caliburn micro 中的 ProgressChanged 不更新进度条
ProgressChanged in Caliburn micro doesn't update progressbar
我试图在 C# WPF 中创建一个进度条,但它不起作用。
我的xaml
<ProgressBar
Height="15"
Maximum="100"
Minimum="0"
Value="{Binding Path=Progress, Mode=OneWay}" />
我的视图模型
public ShellViewModel()
{
loadAirportInfosBgWk = new BackgroundWorker();
loadAirportInfosBgWk.DoWork += loadAirportInfosBgWk_DoWork;
loadAirportInfosBgWk.ProgressChanged += loadAirportInfosBgWk_ProgressChanged;
loadAirportInfosBgWk.RunWorkerCompleted += loadAirportInfosBgWk_RunWorkerCompleted;
loadAirportInfosBgWk.WorkerReportsProgress = true;
loadAirportInfosBgWk.RunWorkerAsync();
}
private void loadAirportInfosBgWk_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
IsBusy = false;
}
private void loadAirportInfosBgWk_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Progress = e.ProgressPercentage;
Console.WriteLine($"{e.ProgressPercentage}%");
}
private void loadAirportInfosBgWk_DoWork(object sender, DoWorkEventArgs e)
{
IsBusy = true;
// Do stuff
loadAirportInfosBgWk.ReportProgress(prog); // prog is int between 0 and 100
}
// _ variables are private variable at the top I omitted them
public bool IsBusy
{
get { return _isBusy; }
set {
_isBusy = value;
NotifyOfPropertyChange(() => IsBusy);
}
}
public int Progress
{
get { return _progress; }
set {
if (_progress != value)
{
_progress = value;
NotifyOfPropertyChange(() => Progress);
}
}
}
奇怪的是,RunWorkerCompleted
正确隐藏了加载组件,但 ProgressChanged
没有更新任何内容。但是已完成功能中的控制台会正确记录该值。
我真的是 Caliburn micro 的新手,希望我能得到它并正确地使用它。我查看了堆栈溢出,但没有找到有用的答案。
**编辑:**
我试图在 Label 中显示属性 Progress
,它正在正确更新,但不是在进度条值中。
可能是我在 DataTemplate 中使用进度条的方式造成的。
详情xaml:
<xctk:BusyIndicator
Grid.RowSpan="2"
Margin="0,0,-0.2,25.6"
Panel.ZIndex="5"
DisplayAfter="0"
IsBusy="{Binding IsBusy}">
<xctk:BusyIndicator.BusyContentTemplate>
<DataTemplate>
<StackPanel Margin="4">
<TextBlock
HorizontalAlignment="Center"
FontWeight="Bold"
Text="Downloading Email" />
<StackPanel Margin="4">
<TextBlock Text="Chargement des données..." />
<ProgressBar
Height="15"
Maximum="100"
Value="{Binding Path=Progress}" />
</StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button
Grid.Column="0"
Margin="0,0,2,0"
HorizontalAlignment="Right"
Content="Pause" />
<Button
Grid.Column="1"
Margin="2,0,0,0"
HorizontalAlignment="Left"
Content="Cancel" />
</Grid>
</StackPanel>
</DataTemplate>
</xctk:BusyIndicator.BusyContentTemplate>
<xctk:BusyIndicator.OverlayStyle>
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="#ffffeeee" />
</Style>
</xctk:BusyIndicator.OverlayStyle>
<xctk:BusyIndicator.ProgressBarStyle>
<Style TargetType="ProgressBar">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</xctk:BusyIndicator.ProgressBarStyle>
</xctk:BusyIndicator>
谢谢,
A.
通过在BusyIndicator
中添加BusyContent="{Binding}"
解决:
<xctk:BusyIndicator
Grid.RowSpan="2"
Margin="0,0,-0.2,25.6"
Panel.ZIndex="5"
BusyContent="{Binding}"
DisplayAfter="0"
IsBusy="{Binding IsBusy}">
<!-- Code -->
</xctk:BusyIndicator>
我试图在 C# WPF 中创建一个进度条,但它不起作用。
我的xaml
<ProgressBar
Height="15"
Maximum="100"
Minimum="0"
Value="{Binding Path=Progress, Mode=OneWay}" />
我的视图模型
public ShellViewModel()
{
loadAirportInfosBgWk = new BackgroundWorker();
loadAirportInfosBgWk.DoWork += loadAirportInfosBgWk_DoWork;
loadAirportInfosBgWk.ProgressChanged += loadAirportInfosBgWk_ProgressChanged;
loadAirportInfosBgWk.RunWorkerCompleted += loadAirportInfosBgWk_RunWorkerCompleted;
loadAirportInfosBgWk.WorkerReportsProgress = true;
loadAirportInfosBgWk.RunWorkerAsync();
}
private void loadAirportInfosBgWk_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
IsBusy = false;
}
private void loadAirportInfosBgWk_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Progress = e.ProgressPercentage;
Console.WriteLine($"{e.ProgressPercentage}%");
}
private void loadAirportInfosBgWk_DoWork(object sender, DoWorkEventArgs e)
{
IsBusy = true;
// Do stuff
loadAirportInfosBgWk.ReportProgress(prog); // prog is int between 0 and 100
}
// _ variables are private variable at the top I omitted them
public bool IsBusy
{
get { return _isBusy; }
set {
_isBusy = value;
NotifyOfPropertyChange(() => IsBusy);
}
}
public int Progress
{
get { return _progress; }
set {
if (_progress != value)
{
_progress = value;
NotifyOfPropertyChange(() => Progress);
}
}
}
奇怪的是,RunWorkerCompleted
正确隐藏了加载组件,但 ProgressChanged
没有更新任何内容。但是已完成功能中的控制台会正确记录该值。
我真的是 Caliburn micro 的新手,希望我能得到它并正确地使用它。我查看了堆栈溢出,但没有找到有用的答案。
**编辑:**
我试图在 Label 中显示属性 Progress
,它正在正确更新,但不是在进度条值中。
可能是我在 DataTemplate 中使用进度条的方式造成的。
详情xaml:
<xctk:BusyIndicator
Grid.RowSpan="2"
Margin="0,0,-0.2,25.6"
Panel.ZIndex="5"
DisplayAfter="0"
IsBusy="{Binding IsBusy}">
<xctk:BusyIndicator.BusyContentTemplate>
<DataTemplate>
<StackPanel Margin="4">
<TextBlock
HorizontalAlignment="Center"
FontWeight="Bold"
Text="Downloading Email" />
<StackPanel Margin="4">
<TextBlock Text="Chargement des données..." />
<ProgressBar
Height="15"
Maximum="100"
Value="{Binding Path=Progress}" />
</StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button
Grid.Column="0"
Margin="0,0,2,0"
HorizontalAlignment="Right"
Content="Pause" />
<Button
Grid.Column="1"
Margin="2,0,0,0"
HorizontalAlignment="Left"
Content="Cancel" />
</Grid>
</StackPanel>
</DataTemplate>
</xctk:BusyIndicator.BusyContentTemplate>
<xctk:BusyIndicator.OverlayStyle>
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="#ffffeeee" />
</Style>
</xctk:BusyIndicator.OverlayStyle>
<xctk:BusyIndicator.ProgressBarStyle>
<Style TargetType="ProgressBar">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</xctk:BusyIndicator.ProgressBarStyle>
</xctk:BusyIndicator>
谢谢, A.
通过在BusyIndicator
中添加BusyContent="{Binding}"
解决:
<xctk:BusyIndicator
Grid.RowSpan="2"
Margin="0,0,-0.2,25.6"
Panel.ZIndex="5"
BusyContent="{Binding}"
DisplayAfter="0"
IsBusy="{Binding IsBusy}">
<!-- Code -->
</xctk:BusyIndicator>