簡體   English   中英

當集合為空時,UWP XAML 拋出未處理的異常

[英]UWP XAML is throwing an unhandled exception when a collection is empty

我有兩個ObservableCollection<T>並且它與兩個不同的ListView UI 綁定。

ObservableCollection<Department> deptList = new ObservableCollection<Department>();

ObservableCollection<Teacher> teacherList = new ObservableCollection<Teacher>();

用戶可以在運行時從集合中添加或刪除項目。

在某些時候,如果其中一個列表為空,應用程序會凍結並引發未處理的異常{Windows.UI.Xaml.UnhandledExceptionEventArgs}

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
            UnhandledException += (sender, e) =>
            {
                if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
            };
#endif

異常信息

消息 = "檢測到布局周期。布局無法完成​​。\\r\\n檢測到布局周期。布局無法完成​​。"

_message = "布置 GUI 時發生循環。"

這是ListView UI 的代碼塊 -

<ListView Header="Department List"
    x:Name="depertmentList"
    ItemsSource="{x:Bind deptList}"
    SelectionMode="Multiple"
    SelectionChanged="depertmentList_SelectionChanged">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="data:Department">
                <StackPanel Margin="1">
                    <TextBlock Text="{x:Bind Dept}" Margin="1"/>
                    <TextBlock Text="{x:Bind SemesterCount}" Margin="1"/>
                    <TextBlock Text = "{Binding Courses, Converter={StaticResource ListToStringConverter}}"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
<ListView Header="Teacher List"
    x:Name="teacherListView"
    ItemsSource="{x:Bind teacherList}"
    SelectionMode="Single"
    SelectionChanged="teacherListView_SelectionChanged"
    Margin="2">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:Teacher">
            <StackPanel>
                <TextBlock Text="{x:Bind Name}"/>
                <TextBlock Text="{x:Bind Designation}" Margin="1"/>
                <TextBlock Text="{x:Bind Dept}" Margin="1"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

事件的 C# 代碼

        private void depertmentList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            
            if (depertmentList.SelectedItem == null)
            {
                removeDept.IsEnabled = false;
                teacherListView.ItemsSource = teacherList;
            }
            else
            {
                removeDept.IsEnabled = true;
                ObservableCollection<Department> t = new ObservableCollection<Department>();
                Department temp = (Department)depertmentList.SelectedItem;
                teacherListView.ItemsSource = from teacher in teacherList
                                              where teacher.Dept == temp.Dept
                                              select teacher;
            }
        }
        private void teacherListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (teacherListView.SelectedItem == null)
            {
                removeTeacher.IsEnabled = false;
            }
            else
            {
                removeTeacher.IsEnabled = true;
            }
        }

需要注意的是, Teacher類派生自Department類。 如果我刪除一個系,所有與該系相關的教師也會被刪除。

為了防止應用程序崩潰,我必須向列表中添加一個硬編碼的垃圾項目,用戶可以稍后在運行時刪除該項目。

如果其中一個列表為空,應用程序就會崩潰。 但如果兩個列表中至少有一項,則不會發生任何事情。

現在,我的問題是如何在不添加任何類型的垃圾項目的情況下解決此問題? 即使列表為空或為空,我也想防止崩潰。

這似乎是一個內部布局設計。 問題是 ScrollViewer 導致循環渲染。 您可以為 scrollViewer 設置高度。 例如:

<ScrollViewer Margin="2" RelativePanel.Below="TeacherFilter" Height="100">

或作為鏈接@Noorul 共享以將 VerticalScrollBarVisibility 設置為 Auto。

<ScrollViewer Margin="2" RelativePanel.Below="TeacherFilter" VerticalScrollBarVisibility="Auto">

你得到的錯誤有點模糊。 您的問題,雖然在不設置平靜的情況下無法完全調試,而 c# 是此問題的一種變體。

當您的一個或另一個列表為空時,就會發生某種異常。 您是否有任何假設會返回的 linq 查詢? 畢竟你訪問過那個東西嗎?

問題只是說 UWP 正在無限循環中嘗試重建您的 UI,發生了不好的事情並重試。 這就是您的應用程序崩潰的原因。 因為無限循環。

如果您在 ListView 中使用了滾動查看器,或者當列表中沒有項目時,您可以遍歷您的項目。

該線程討論相同的問題。

檢測到布局周期,布局無法完成

檢測到布局周期。 布局無法完成​​。 檢測到布局周期。 布局無法完成

希望這可以幫助。

如果您發布您的 xaml 代碼,它將有助於診斷您的問題。

謝謝你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM