7

現在、前任者のツールをアップグレードしていますが、TreeView問題が発生しています。彼のソフトウェアはデータを 1 回分析し、結果をTreeView. リアルタイム データを分析するようにツールを変更したため、ユーザーはリアルタイムで結果を取得できます。ここで、更新後でも、ユーザーが展開したときにツリービューノードを展開したままにしたいと思います。このトピックが何度か議論されていることは知っており、回答を読むのに何時間も費やしましたが、問題の解決策は見つかりませんでした.

基本的な問題は、安定したツリーがなくなり、現在、ツリーが毎回再作成されていることです。私はこれまでデータ バインディングや XAML について何も知らず、XAML でプログラミングを学ぶ時間もほとんどありませんでした。以下に、私の前任者が作成したようなコードを示します。今まで何も変更していません。この方法を 2 ~ 5 秒ごとに思い出すだけです。

展開されたノードに関する情報をどこにでも (グローバルに?) 保存し、更新後に再展開する (簡単な?) 方法はありますか?

foreach (Analyzer.ALARM_GROUP alarmGroup in alarmGroupList)
{
    //Display Problem Group
    TreeViewItem groupItem = new TreeViewItem();
    List<String> ListAreas = new List<string>();
    string areas = "";

    //GROUP HEADER
    //display alarm group which contains more than one alarm
    if (alarmGroup.AlarmList.Count > 1)
    {
        groupItem.Header = Convert.ToString(alarmGroup.AlarmList.Count) + " --- " + alarmGroup.AlarmList[0].EventTime + "     " + alarmGroup.AlarmList[0].AlarmText + "\n         "
                    + alarmGroup.AlarmList[alarmGroup.AlarmList.Count - 1].EventTime + "     " + alarmGroup.AlarmList[alarmGroup.AlarmList.Count - 1].AlarmText
                    + " --- " + " AREAS: " + areas;
    }
    else //display alarm group with only one alarm message
    {
        groupItem.Header = Convert.ToString(alarmGroup.AlarmList.Count) + " --- " + alarmGroup.AlarmList[0].EventTime + "     " + alarmGroup.AlarmList[0].AlarmText + " --- " + " AREA: " + areas;
    }

    //HEADLINE of single Alarm Item
    TreeViewItem alarmItem = new TreeViewItem();
    alarmItem.Header = "[EVENTTIME]                           [ALARMTAG] --- [OPCCONDITION] --- [SEVERITY] --- [AREA] --- [ALARMTEXT]";
    alarmItem.FontWeight = FontWeights.SemiBold;
    groupItem.Items.Add(alarmItem);

    //Display single alarm messages
    foreach (var alarm in alarmGroup.AlarmList)
    {
        alarmItem = new TreeViewItem();
        alarmItem.Header = alarm.EventTime + " --- " + alarm.AlarmTag + " --- " + alarm.Condition + " --- " + alarm.Severity + " --- " + alarm.Area + " --- " + alarm.AlarmText;
        alarmItem.FontWeight = FontWeights.Normal;
        groupItem.Items.Add(alarmItem);
    }

    AlarmPresentationBox.Items.Add(groupItem); 
4

2 に答える 2

5

最初に WPF をより深く理解する必要がありますか?

はい、特にこのアプリケーションを長期間使用/サポートする予定がある場合に備えて、はいと言います。また、将来 WPF で作業したい場合は、XAML と WPF の概念を理解することをお勧めします。

個人的には、このツールをこのように実装することは決してありません。代わりに、次の記事で説明されているように MVVM アプローチを採用し、クリーンで保守可能で効率的なものにします - Simplifying the WPF TreeView by Using the ViewModel Pattern

展開されたノードに関する情報をどこにでも (グローバルに?) 保存し、更新後に再展開する (簡単な?) 方法はありますか?

あなたはこのようなことを試すことができます -

展開されたノードのヘッダー (または一意のプロパティ/ID) を格納するリストを作成します

private List<string> expandedNodes = new List<string>();

各ノード (子ノードを持つ) の Expanded および Collapsed イベントを処理します。

TreeViewItem alarmItem = new TreeViewItem();
alarmItem.Expanded += OnAlarmItemExpanded;

ノードが展開/折りたたまれるたびにリストを更新します -

private void OnAlarmItemExpanded(object sender, RoutedEventArgs e)
{
    TreeViewItem treeNode = sender as TreeViewItem;
    string header = treeNode.Header.ToString();
    if (expandedNodes.Contains(header) == false)
    {
        expandedNodes.Add(header);
    }
}

private void OnAlarmItemCollapsed(object sender, RoutedEventArgs e)
{
    TreeViewItem treeNode = sender as TreeViewItem;
    string header = treeNode.Header.ToString();
    if (expandedNodes.Contains(header))
    {
        expandedNodes.Remove(header);
    }
} 

次回 TreeViewItem を作成するときはいつでも、ヘッダー (Uniques Id) がリストに存在する場合は展開します -

if (expandedNodes.Contains(header))
{
    alarmItem.IsExpanded = true;
}

これは、groupItem と alarmItem の両方に対して行う必要があります。

于 2012-07-18T12:54:16.130 に答える
-1

CompareTreeViewItem -

private void CompareTreeViewItem(TreeViewItem TViewItem1,TreeViewItemTViewItem2)
{
    if ((string)TViewItem1.Header == (string)TViewItem2.Header)
    {
        TViewItem2.IsExpanded = TViewItem1.IsExpanded;

        if (TViewItem1.Items.Count > 0)
        {
            for (int i = 0; i < TViewItem1.Items.Count && i < TViewItem2.Items.Count; i++)
            {
                CompareTreeViewItem((TreeViewItem)TViewItem1.Items[i],
                                    (TreeViewItem)TViewItem2.Items[i]);
            }
        }
    }
}
于 2016-02-21T13:29:39.937 に答える