- 新しい WPF アプリを作成する
- メインウィンドウに「tree1」という名前のツリービューを配置します
- 次のコードをコピーして貼り付けて、実際の動作を確認してください
TreeViewItem
基本的に、どのハンドラがどのノードに追加されているかを追跡するメカニズムを継承して構築する必要がありevent
ます。残念ながら、取得する登録済みハンドラに関する情報はありません。
また、ノードを構築するには、新しい継承のみに依存する必要があります。これにより、適切に動作します。つまり、もはや を参照する必要はありませんがTreeViewItem
、参照する必要がありますTreeNode
(これは私がカスタム クラスに付けた名前です。自由に変更してください)。
約束されたコードは以下のとおりです。ツリーに「rootNode」ノードを追加すると、展開時に兄弟ノードが作成され、同じハンドラがそれ自体に引き継がれます (したがって、展開時に兄弟も作成され、すぐ)。
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TreeNode root = new TreeNode();
root.Header = "root";
tree1.Items.Clear();
// add node to tree before adding handlers, or you'll get
// a StackOverflowException
tree1.Items.Add(root);
root.AddHandler(TreeNode.ExpandedEvent, new RoutedEventHandler(expandedHandler));
}
private void expandedHandler(object sender, RoutedEventArgs e) { newNodeCopyExpandedHandlers(sender as TreeNode); }
private void newNodeCopyExpandedHandlers(TreeNode node)
{
TreeNode newNode = new TreeNode();
newNode.Header = "nuovo!";
// add node to tree before adding handlers, or you'll get
// a StackOverflowException
tree1.Items.Add(newNode);
foreach (Delegate d in newNode.GetHandlers(node, TreeNode.ExpandedEvent))
newNode.AddHandler(TreeNode.ExpandedEvent, d);
}
}
public class TreeNode : TreeViewItem
{
private Dictionary<RoutedEvent, List<Delegate>> handlersList = new Dictionary<RoutedEvent, List<Delegate>>();
public new void AddHandler(RoutedEvent e, Delegate d)
{
if (!handlersList.ContainsKey(e)) handlersList.Add(e, new List<Delegate>());
handlersList[e].Add(d);
base.AddHandler(e, d);
}
public new void RemoveHandler(RoutedEvent e, Delegate d)
{
if (!handlersList.ContainsKey(e)) handlersList.Add(e, new List<Delegate>());
if (handlersList[e].Contains(d)) handlersList[e].Remove(d);
base.RemoveHandler(e, d);
}
public List<Delegate> GetHandlers(TreeNode n, RoutedEvent e)
{
if (n.handlersList.ContainsKey(e)) return n.handlersList[e];
else return null;
}
}
}