Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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在UI被阻止时显示和加载指示器_C#_Wpf_Multithreading_Xaml - Fatal编程技术网

C#WPF在UI被阻止时显示和加载指示器

C#WPF在UI被阻止时显示和加载指示器,c#,wpf,multithreading,xaml,C#,Wpf,Multithreading,Xaml,我最近在这里读了很多帖子,想找到解决我问题的办法,但其中没有一个帖子看起来能工作 所以我的问题是: 我有一个很长的加载函数,在这个函数中,我沿着对象列表浏览了几次。(主要是因为我必须找到孩子和孩子的孩子…) 这个函数在大多数情况下都能工作,但它的速度有点慢,尽管我已经尝试尽可能多地使用线程并预加载巨大的数据表 最大的问题是,我生成了UserControls,生成了更多的UserControls,这些UserControls相互插入 也许这会有帮助: -遍历所有对象,并找到父对象为null的对象

我最近在这里读了很多帖子,想找到解决我问题的办法,但其中没有一个帖子看起来能工作

所以我的问题是: 我有一个很长的加载函数,在这个函数中,我沿着对象列表浏览了几次。(主要是因为我必须找到孩子和孩子的孩子…)

这个函数在大多数情况下都能工作,但它的速度有点慢,尽管我已经尝试尽可能多地使用线程并预加载巨大的数据表

最大的问题是,我生成了UserControls,生成了更多的UserControls,这些UserControls相互插入

也许这会有帮助:
-遍历所有对象,并找到父对象为null的对象
-然后遍历parent=null的所有“child”,并将它们插入到scrollviewer中
-每个插入的子元素将搜索自己的子元素,并在其自身元素的stackPanel中生成另一个概览。

所有这些渲染/计算都需要一些时间,在运行时,用户会看到一个灰色窗口,因为我正在“window.load()”函数中调用此函数

我现在想做的是,显示一个圆环或图像,并在所有这些图形元素添加到主窗口时旋转它

private void getData() {
LoadingMessage lm = new LoadingMessage() { Owner = this };
Application.Current.Dispatcher.Invoke(() => { lm.Show(); });
tbLoading.Text += ".";
//dtRacks = Storage.getAllNormalRacks();
//DataTable dtparents = dtRacks.AsDataView().ToTable(true, "CONTENTOF");
bool hasRacks = false;

start = Storage.getStorageObject(parentID);

spRooms.Children.Clear();
tbHeader.Text = "Übersicht: " + start["DESCRIPTION"].ToString();


DataTable dtchilds = getChilds(parentID);

foreach (DataRow dr in dtchilds.Rows) {
    string type = dr["TYPE"].ToString();

    if (type == "8") {
        RoomOverview ro = new RoomOverview(dr["ID"].ToString(), dr["DESCRIPTION"].ToString(), search, this);
        foreach (Expander ex in ro.MainGrid.Children.OfType<Expander>()) {
            ex.IsExpanded = true;
        }
        ro.Padding = new Thickness(3, 0, 1, 0);
        if (ro.spFridges.Children.Count >= 1) spRooms.Children.Add(ro);

    }

    if (type == "1" || type == "2" || type == "3" || type == "4") {
        RefrigeratorOverview ro = new RefrigeratorOverview(dr["ID"].ToString(), dr["DESCRIPTION"].ToString(), search, this);
        ro.Padding = new Thickness(3, 0, 1, 0);
        if (ro.spStudies.Children.Count >= 1) spRooms.Children.Add(ro);
    }
    if (type == "5") hasRacks = true;
}

if (hasRacks) {
    RefrigeratorOverview ro = new RefrigeratorOverview(parentID, start["DESCRIPTION"].ToString(), search);
    ro.Padding = new Thickness(3, 0, 1, 0);
    if (ro.spStudies.Children.Count >= 1) spRooms.Children.Add(ro);
}

if (roots.Count > 0) {
    foreach (string s in roots) {
        RoomOverview ro = new RoomOverview(s, null, search, this);
        ro.Padding = new Thickness(3, 0, 1, 0);
        if (ro.spFridges.Children.Count >= 1) spRooms.Children.Add(ro);

    }
    tbLoading.Visibility = Visibility.Hidden;
    Application.Current.Dispatcher.Invoke(() => { lm.Close(); });
}
}
private void getData(){
LoadingMessage lm=new LoadingMessage(){Owner=this};
Application.Current.Dispatcher.Invoke(()=>{lm.Show();});
tbLoading.Text+=”;
//dtRacks=Storage.getAllNormalRacks();
//DataTable dtparents=dtRacks.AsDataView().ToTable(true,“CONTENTOF”);
bool-haslacks=false;
start=Storage.getStorageObject(parentID);
spRooms.Children.Clear();
tbHeader.Text=“Übersicht:+start[“DESCRIPTION”].ToString();
数据表dtchilds=getChilds(parentID);
foreach(dtchilds.Rows中的数据行dr){
字符串类型=dr[“type”].ToString();
如果(类型=“8”){
RoomOverview ro=新的RoomOverview(dr[“ID”].ToString(),dr[“DESCRIPTION”].ToString(),搜索,此项);
foreach(ro.MainGrid.Children.OfType()中的Expander ex){
ex.IsExpanded=真;
}
ro.填料=新厚度(3,0,1,0);
如果(ro.spFridges.Children.Count>=1)spRooms.Children.Add(ro);
}
如果(类型==“1”| |类型==“2”| |类型==“3”| |类型==“4”){
冰箱概览ro=新冰箱概览(dr[“ID”].ToString(),dr[“DESCRIPTION”].ToString(),搜索,此项);
ro.填料=新厚度(3,0,1,0);
如果(ro.spStudies.Children.Count>=1)spRooms.Children.Add(ro);
}
如果(类型==“5”)hasRacks=true;
}
如果(hasRacks){
冰箱概览ro=新冰箱概览(父ID,开始[“说明”]。ToString(),搜索);
ro.填料=新厚度(3,0,1,0);
如果(ro.spStudies.Children.Count>=1)spRooms.Children.Add(ro);
}
如果(roots.Count>0){
foreach(根中的字符串s){
RoomOverview ro=新的RoomOverview(s,null,search,this);
ro.填料=新厚度(3,0,1,0);
如果(ro.spFridges.Children.Count>=1)spRooms.Children.Add(ro);
}
tbLoading.Visibility=Visibility.Hidden;
Application.Current.Dispatcher.Invoke(()=>{lm.Close();});
}
}
我尝试将整个函数放入一个线程函数中,但随后我对“RoomOverview ro=new RoomOverview”和“ReflectorOverview ro=new ReflectorOverview”的调用给了我一个错误,因为它们无法向主窗体添加任何内容,因为它属于另一个线程

我希望任何人都能理解我在这里要做的事情,并希望知道一个解决方案。

致以最诚挚的问候

Alex

似乎
RoomOverview
ReflectorOverview
是控件。如果是这样,那就不是使用WPF的好方法。请考虑学习MVVM。这使这类事情变得容易多了。处理混合了数据库和UI控件的代码是非常痛苦的。理想情况下,您应该编写一个方法来处理数据库内容并返回一组普通C#类实例。然后将它们放入绑定到
ItemsControl
ObservableCollection
中,并使用
DataTemplate
为您创建所有UI控件

但如果你不想重新设计,你可以挽救你所拥有的

正如您尝试的那样,将所有进程放在另一个线程中

然后,要触摸UI线程中的控件,您需要“调用到UI线程”,这意味着从工作线程内部,您可以使代码在UI线程中执行:

RoomOverview ro = null;
var id = dr["ID"].ToString();
var description = dr["DESCRIPTION"].ToString();

Dispatcher.CurrentDispatcher.Invoke(new Action(() => {
    ro = new RoomOverview(id, description, search, this);
    foreach (Expander ex in ro.MainGrid.Children.OfType<Expander>()) {
        ex.IsExpanded = true;
    }
    ro.Padding = new Thickness(3, 0, 1, 0);
    if (ro.spFridges.Children.Count >= 1) spRooms.Children.Add(ro);
}));
ro=null;
var id=dr[“id”].ToString();
var description=dr[“description”].ToString();
Dispatcher.CurrentDispatcher.Invoke(新操作(()=>{
ro=新房间概览(id、说明、搜索、本);
foreach(ro.MainGrid.Children.OfType()中的Expander ex){
ex.IsExpanded=真;
}
ro.填料=新厚度(3,0,1,0);
如果(ro.spFridges.Children.Count>=1)spRooms.Children.Add(ro);
}));

我要说的是——并非粗鲁——你在用非常错误的方法来计算gui元素以获取数据和进行处理……你必须通过MVVM操作模型和/或视图模型,而不是视图……有很多解决方案,我想知道为什么它们都不适合你。首先,您身处WPF世界(欢迎!),因此请不要在代码中创建UI。使用XAML和MVVM技术。这将为您解决所有线程问题,您可以轻松地在应用程序中添加一些繁忙的指示器或类似的内容。嗯,我实际上是WPF的新手,对MVVM不太了解,但我一定会尝试进一步研究。我现在可能不打算重构我的整个项目(它发展得非常快),但将来我可能会尝试使用更好的MVVM模型。:-)谢谢你的评论谢谢你对我的帮助。它并不完美,我想这是我的错,也是我的编码方式