[英]WPF Update UI while loading
我要在加载一些长时间的工作时更新UI。 我想要的是数据加载时的内容,我想显示一个UserControl
,它不过是一条等待消息。 我已经尝试过BackgroundWorker
, Dispatcher.BeginInvoke
和ThreadPool.QueueUserWorkItem
但是我不知道为什么它没有按预期进行。 请帮忙
Dispatcher.BeginInvoke(new Action(() => img.Visibility = Visibility.Visible));
//Load some long wok here
Dispatcher.BeginInvoke(new Action(() => img.Visibility = Visibility.Collapsed), DispatcherPriority.Background);
我正在寻找的是在加载时显示图像,加载完成后必须将其折叠。
编辑:
<Grid Grid.Column="2"
Name="DetailsPane">
<Grid.Background>
<ImageBrush ImageSource="img/back.jpg"
Stretch="UniformToFill" />
</Grid.Background>
<Image Name="img"
Margin="5"
Stretch="None"
Visibility="Collapsed"
Source="img/Loading.png" />
</Grid>
在列表框SelectionChanged上进行加载时,我有一个要显示的图像。 因此,在SelectionChanged事件内部,我将在列表框Clikeed的特定事件的名为DetailsPane的网格中加载详细信息。 加载信息时, 如何在DetailsPane上显示此图像 ?
到达这里
创建了一个名为State of bool的依赖项属性,然后
private void LstAllFeatures_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
State = false;
// Loading Heavy Work
State = true;
}
<Image Name="img"
Margin="5"
Stretch="None">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Visibility"
Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding State}"
Value="False">
<Setter Property="Visibility"
Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
在DeatilsPane.Children
> _visualChildren
> InternalArray[0]
是一个图像。 当打开时,在WPF Visualizer中显示“图像可见性=可见”,但不显示。 请把它照亮。
首先userControl必须实现INotifyPropertyChanged,如:
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
然后国家必须定义如下:
public bool _state;
public bool State
{
get { return _state; }
set
{
if (value != _state)
{
_state= value;
RaisePropertyChanged();
}
}
}
然后在您要调用LongWork()的代码中
State = true;
await Task.Run(()=>LongWork());
State = fasle;
然后在xaml中,您可以这样写:
<Image Margin="5"
Stretch="None">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Visibility"
Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding State,RelativeSource= {RelativeSource AncestorType={x:Type test:UserControlName}},Mode=TwoWay}"
Value="False">
<Setter Property="Visibility"
Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
添加bool
属性:
public bool IsLoading
{
get { return isLoading; }
set { isLoading = value; NotifyPropertyChanged("IsLoading"); }
}
数据将其绑定到Image.Visibility
属性:
<Image Margin="5" Stretch="None" Source="img/Loading.png">
<Image .Style>
<Style>
<Setter Property="Control.Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsLoading}" Value="True">
<Setter Property="Control.Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
在后台线程上开始长时间运行的任务时,将其设置为true
:
IsLoading = true;
完成长时间运行的过程后,将其设置为false
:
IsLoading = false;
请注意,这仅在您在后台线程上运行了长时间运行的进程时才有效,否则,UI线程将处于繁忙状态且不会更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.