选择 child 时 WPF IsSelected 阻止触发
WPF IsSelected prevent trigger when selecting child
我遇到了 运行 的问题,我不确定是否可以避免它。我想它默认是这样设计的。
我编写了一个由 XML 填充的树视图列表,并且当 selected 时,每个节点都在填充一些文本框。根据它们的类型,它会触发不同的功能。
问题是,当我 select 一个 child 时,它似乎触发 "IsSelecting" 所有 parents treeviewitem 一直到顶部 return 也会触发关联的函数,但我不想这样。
知道如何为 IsSelected 防止这种 "Sort of reverse inheritance" 吗?
示例(检查下面的代码): selecting "node" 将触发 "Node_Selected"、"Dialog_Selected"、"Actor_Selected".
感谢您的帮助。
此致,
仅供参考:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
XmlDocument document = new XmlDocument();
document.Load("XML/ActorsDialogs.xml");
XmlNodeList actors = document.SelectNodes("/dialogs/actor");
foreach (XmlNode actor in actors)
{
TreeViewItem newActor = new TreeViewItem();
newActor.Header = actor.SelectSingleNode("actorname").InnerText;
newActor.Selected += new RoutedEventHandler(Actor_Selected);
XmlNodeList dialogs = actor.SelectNodes("dialog");
foreach (XmlNode dialog in dialogs)
{
TreeViewItem newdialog = new TreeViewItem();
newdialog.Header = "Dialog:" + dialog.SelectSingleNode("dialogID").InnerText;
newdialog.Selected += new RoutedEventHandler(Dialog_Selected);
BuildNodes(newdialog, dialog);
newActor.Items.Add(newdialog);
}
ActorsList.Items.Add(newActor);
}
}
private void BuildNodes(TreeViewItem treeNode, XmlNode parentElement)
{
foreach (XmlNode child in parentElement.ChildNodes)
{
if (child.Name == "node" || child.Name == "reply")
{
XmlElement childElement = child as XmlElement;
TreeViewItem childTreeNode = new TreeViewItem();
string ID = child.SelectSingleNode(child.Name + "ID").InnerText;
childTreeNode.Header = childElement.Name + ":" + ID;
switch (child.Name)
{
case "node":
childTreeNode.Selected += new RoutedEventHandler(Node_Selected);
break;
case "reply":
childTreeNode.Selected += new RoutedEventHandler(Reply_Selected);
break;
default:
break;
}
treeNode.Items.Add(childTreeNode);
BuildNodes(childTreeNode, childElement);
}
}
}
private void Actor_Selected(object sender, RoutedEventArgs e){}
private void Dialog_Selected(object sender, RoutedEventArgs e){}
private void Node_Selected(object sender, RoutedEventArgs e){}
private void Reply_Selected(object sender, RoutedEventArgs e){}
在事件处理程序中,您可以设置 e.Handled = true。这将防止事件在树上冒泡。
private void Node_Selected(object sender, RoutedEventArgs e)
{
e.Handled = true; //this will prevent the event from bubbling up to parents;
//Do the rest of the code here.
}
有关 RoutedEvent 的详细信息,请参阅 https://msdn.microsoft.com/en-us/library/ms742806%28v=vs.110%29.aspx。这些包括上升到树的冒泡事件和下降到树的隧道事件。
我遇到了 运行 的问题,我不确定是否可以避免它。我想它默认是这样设计的。
我编写了一个由 XML 填充的树视图列表,并且当 selected 时,每个节点都在填充一些文本框。根据它们的类型,它会触发不同的功能。
问题是,当我 select 一个 child 时,它似乎触发 "IsSelecting" 所有 parents treeviewitem 一直到顶部 return 也会触发关联的函数,但我不想这样。
知道如何为 IsSelected 防止这种 "Sort of reverse inheritance" 吗?
示例(检查下面的代码): selecting "node" 将触发 "Node_Selected"、"Dialog_Selected"、"Actor_Selected".
感谢您的帮助。
此致,
仅供参考:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
XmlDocument document = new XmlDocument();
document.Load("XML/ActorsDialogs.xml");
XmlNodeList actors = document.SelectNodes("/dialogs/actor");
foreach (XmlNode actor in actors)
{
TreeViewItem newActor = new TreeViewItem();
newActor.Header = actor.SelectSingleNode("actorname").InnerText;
newActor.Selected += new RoutedEventHandler(Actor_Selected);
XmlNodeList dialogs = actor.SelectNodes("dialog");
foreach (XmlNode dialog in dialogs)
{
TreeViewItem newdialog = new TreeViewItem();
newdialog.Header = "Dialog:" + dialog.SelectSingleNode("dialogID").InnerText;
newdialog.Selected += new RoutedEventHandler(Dialog_Selected);
BuildNodes(newdialog, dialog);
newActor.Items.Add(newdialog);
}
ActorsList.Items.Add(newActor);
}
}
private void BuildNodes(TreeViewItem treeNode, XmlNode parentElement)
{
foreach (XmlNode child in parentElement.ChildNodes)
{
if (child.Name == "node" || child.Name == "reply")
{
XmlElement childElement = child as XmlElement;
TreeViewItem childTreeNode = new TreeViewItem();
string ID = child.SelectSingleNode(child.Name + "ID").InnerText;
childTreeNode.Header = childElement.Name + ":" + ID;
switch (child.Name)
{
case "node":
childTreeNode.Selected += new RoutedEventHandler(Node_Selected);
break;
case "reply":
childTreeNode.Selected += new RoutedEventHandler(Reply_Selected);
break;
default:
break;
}
treeNode.Items.Add(childTreeNode);
BuildNodes(childTreeNode, childElement);
}
}
}
private void Actor_Selected(object sender, RoutedEventArgs e){}
private void Dialog_Selected(object sender, RoutedEventArgs e){}
private void Node_Selected(object sender, RoutedEventArgs e){}
private void Reply_Selected(object sender, RoutedEventArgs e){}
在事件处理程序中,您可以设置 e.Handled = true。这将防止事件在树上冒泡。
private void Node_Selected(object sender, RoutedEventArgs e)
{
e.Handled = true; //this will prevent the event from bubbling up to parents;
//Do the rest of the code here.
}
有关 RoutedEvent 的详细信息,请参阅 https://msdn.microsoft.com/en-us/library/ms742806%28v=vs.110%29.aspx。这些包括上升到树的冒泡事件和下降到树的隧道事件。