繁体   English   中英

加载时WPF更新UI

[英]WPF Update UI while loading

我要在加载一些长时间的工作时更新UI。 我想要的是数据加载时的内容,我想显示一个UserControl ,它不过是一条等待消息。 我已经尝试过BackgroundWorkerDispatcher.BeginInvokeThreadPool.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的依赖项属性,然后

.CS

private void LstAllFeatures_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    State = false;
    // Loading Heavy Work 
     State = true;
}

XAML

<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.

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