我正在使用 Syncfusion WPF控件。我创建了一个显示径向树图的项目。
我正在尝试访问图片底部内容(Link,LinkID,ParentID等)下列出的基本值。
图片:
查看NodeSelected
事件,当我运行node.Content.GetType().ToString()
时,我得到了包含我想要访问的属性的基类模型。
所以我不确定如何从选择节点到获取作为节点数据的基类的属性。
希望一切都有道理,我自学成才。
这是我的MainWindow代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using Syncfusion;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Syncfusion.UI.Xaml.Diagram.Layout;
using Syncfusion.UI.Xaml.Diagram;
using System.Collections.ObjectModel;
using Link_Map.Classes;
using Syncfusion.SfSkinManager;
using Syncfusion.Windows.Shared;
using Syncfusion.Windows.Tools.Controls;
using Syncfusion.UI.Xaml.Diagram.Controls;
namespace Link_Map
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : RibbonWindow
{
Controller controller = new Controller();
DirectedTreeLayout tree = new DirectedTreeLayout();
ObservableCollection<Node> nodes = new ObservableCollection<Node>();
ObservableCollection<Connector> connects = new ObservableCollection<Connector>();
public MainWindow()
{
InitializeComponent();
InitDiagram();
controller.AddRoot();
Link_Grid.ItemsSource = controller.viewmodel.Links;
SkinStorage.SetVisualStyle(this, "Blend");
//nodes.ElementAt(0).IsSelected = true;
}
private void InitDiagram()
{
controller.Init();
lmWindow.Nodes = nodes;
lmWindow.Connectors = connects;
DataSourceSettings settings = new DataSourceSettings();
settings.DataSource = controller.viewmodel.Links;
settings.ParentId = "ParentID";
settings.Id = "LinkID";
settings.Root = "0";
lmWindow.DataSourceSettings = settings;
settings.DataSource = controller.viewmodel.Links;
(lmWindow.Info as IGraphInfo).ItemAdded += MainWindow_ItemAdded;
(lmWindow.Info as IGraphInfo).ItemSelectedEvent += NodeSelected;
lmWindow.LayoutManager = new LayoutManager()
{
Layout = new RadialTreeLayout()
};
(lmWindow.LayoutManager.Layout as RadialTreeLayout).HorizontalSpacing = 10;
(lmWindow.LayoutManager.Layout as RadialTreeLayout).VerticalSpacing = 35;
//lmWindow.Tool = Tool.SingleSelect;
//lmWindow.Tool = Tool.ZoomPan;
lmWindow.Menu = null;
lmWindow.ScrollSettings.ScrollLimit = ScrollLimit.Diagram;
lmWindow.DefaultConnectorType = ConnectorType.Line;
lmWindow.PageSettings.PageBorderBrush = new SolidColorBrush(Colors.Transparent);
SelectorViewModel svm = (lmWindow.SelectedItems as SelectorViewModel);
svm.SelectorConstraints = svm.SelectorConstraints & ~(SelectorConstraints.QuickCommands|SelectorConstraints.Resizer);
//lmWindow.Constraints = SelectorConstraints.QuickCommands;
//lmWindow.Constraints = lmWindow.Constraints & ~(GraphConstraints.Draggable | GraphConstraints.Selectable);
}
public void NodeSelected(object sender, DiagramEventArgs e)
{
Node node = (e.Item as Node);
string ders = node.Content.GetType().ToString();
Console.WriteLine(ders);
}
private void Metro_Theme_Click(object sender, RoutedEventArgs e)
{
SkinStorage.SetVisualStyle(this, "Metro");
}
private void Blend_Theme_Click(object sender, RoutedEventArgs e)
{
SkinStorage.SetVisualStyle(this, "Blend");
}
private void Add_Click(object sender, RoutedEventArgs e)
{
for(int i=0; i<10; i++)
{
controller.AddLink();
}
lmWindow.LayoutManager.Layout.UpdateLayout();
}
//https://www.syncfusion.com/forums/127392/how-to-fire-event-on-sfdiagram-node-selection
//Apply Node and Connector Style
private void MainWindow_ItemAdded(object sender, ItemAddedEventArgs args)
{
if (args.Item is INode)
{
(args.Item as INode).UnitWidth = 10;
(args.Item as INode).UnitHeight = 10;
(args.Item as INode).ContentTemplate = this.lmWindow.Resources["contentTemplate"] as DataTemplate;
}
else if (args.Item is IConnector)
{
SolidColorBrush solid = new SolidColorBrush();
solid.Color = Color.FromArgb(255, 186, 186, 186);
(args.Item as IConnector).TargetDecoratorStyle = this.Resources["style"] as Style;
}
}
private void Link_Grid_GridPasteContent(object sender, Syncfusion.UI.Xaml.Grid.GridCopyPasteEventArgs e)
{
}
}
}
答案 0 :(得分:0)
好吧,我解决了我的问题,但我不知道为什么会这样。
我是自学成才,所以我只想尝试一切,直到它有效。我能够获得我想要的基类内容:
public void NodeSelected(object sender, DiagramEventArgs e)
{
Node node = (e.Item as Node);
string ders = ((Link_Map.Classes.Links)(((System.Windows.Controls.ContentControl)(node)).Content)).link;
Console.WriteLine(ders);
}
尽管(node)).Content)).link
是我想要的属性,但我现在可以从这里访问任何基类属性。
如果有人有更好的方法,请发帖!
答案 1 :(得分:0)
要求:“需要获取所选节点的内容属性”。
方式1:施法: 要执行强制转换,请在要转换的值或变量前面的括号中指定要转换的类型。我们提供了一个代码示例来表示这一点。请参考下面的代码示例。
方式2:通过foreach_Reflection迭代属性: GetProperties方法(FrameWork)用于获取类模型Properties,因为我们已经找到了属性值。请参考下面的代码示例。
代码示例:
//ItemSelectedEvent
(diagram.Info as IGraphInfo).ItemSelectedEvent += MainWindow_ItemSelectedEvent;
void MainWindow_ItemSelectedEvent(object sender, DiagramEventArgs args)
{
INode node = args.Item as INode;
//Way 1:casting
string des = (node.Content as Employee).EmpId.ToString();
Console.WriteLine(des);
//Way 2: Iterate the Propeties via foreach
foreach(var prop in node.Content.GetType().GetProperties())
{
string des= prop.GetValue(node.Content).ToString();
Console.WriteLine(des);
}
}
这里,图是SfDiagram的一个实例,Employee是基类。