代码之家  ›  专栏  ›  技术社区  ›  okiedev

如何以编程方式更新SyncFusion UWP图的节点和连接器?

  •  0
  • okiedev  · 技术社区  · 7 年前

    我正在评估SyncFusion SfDiagram,但很难找到从UWP中的C#更新节点和连接器的方法?我正在测试他们在 Getting Started 文档并将EmpId修改为字符串。结果是添加了新节点,但仍显示原始节点。我希望只看到我在C#代码中添加的两个节点。

    我发现他们的文档有点混乱。我试过以下方法:

    XAML

    <local:Employees  x:Name="EmployeesCollection" x:Key="Employees">
        <local:Employee Name="Elizabeth" EmpId="1" ParentId="" Designation="CEO"/>
        <local:Employee Name="Christina" EmpId="2" ParentId="1" Designation="Manager"/>
    </local:Employees>
    

    C#

    EmployeesCollection.Clear();
    employee e = new Employee();
    e.Name = t.Designation = e.EmpId = "10";
    e.ParentId = "";
    EmployeesCollection.Add(e);
    
    employee e = new Employee();
    e.Name = t.Designation = e.EmpId = "11";
    e.ParentId = "10";
    EmployeesCollection.Add(e);
    
    diagram.UpdateLayout();
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Keerthivasan R    7 年前

    请在运行时按以下方式更新数据源设置:,

     Employees employees = new Employees(); 
        DataSourceSettings settings = new DataSourceSettings(); 
        settings.ParentId = "ParentId"; 
        settings.Id = "EmpId"; 
    
    
        employees.Add(new Employee() { EmpId = 1, ParentId = "", Name = "Charly", Designation = "Manager" }); 
        employees.Add(new Employee() { EmpId = 2, ParentId = "1", Name = "Ronald", Designation = "TeamLead" }); 
    
        settings.DataSource = employees; 
        sfdiagram.DataSourceSettings = settings; 
    

    LayoutManager的RefreshFrequency属性支持。RefreshFrequency属性用于在更改节点或连接器集合时更新布局。提供的代码示例来表示这一点。请参考下面的代码示例。

    代码示例:

    sfdiagram.LayoutManager.RefreshFrequency = RefreshFrequency.ArrangeParsing;
    
    Here, sfdiagram is instance of SfDiagram 
    

    有关更多信息,请参阅下面的知识库链接。

    https://www.syncfusion.com/kb/6258/how-to-update-layout-automatically-when-collection-is-changed

    建议2: UpdateLayout方法支持布局。用于安排节点位置。提供了代码示例来表示这一点。

    代码示例:

    //Diagram Loaded Event 
    sfdiagram.Loaded += MainWindow_Loaded; 
    void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
    sfdiagram.LayoutManager.Layout.UpdateLayout(); 
    } 
    
    Here, sfdiagram is instance of SfDiagram. 
    

    有关UpdateLayout的更多信息,请参阅下面的文档链接。

    文档链接: https://help.syncfusion.com/wpf/sfdiagram/automatic-layouts#updating-the-layout

    当做

    Keerthivasan R。

        2
  •  1
  •   Ibrahim Malluf    7 年前

    我也在评估SF图。

    我试图从ViewModel的角度来做任何事情。我将图表的DataSourceSetting绑定到DataSourceSettings类型的VM属性。 在ViewModel中,我将DataSourceSettings数据源属性更改为新集合。

     Activities = new ObservableCollection<Activity>(App.AppState.BPAnalysis.IDEFOActivities[0].Activities.ToList());
    
            DS.DataSource = Activities;
    
            OnDiagramUpdated(EventArgs.Empty);
    

    现在从ViewModel的角度来看丑陋的部分。我的Viewmodel引发一个“OnDiagramUpdated”事件,我在codebhind中处理它,如下所示:

     public sealed partial class Diagramer : UserControl
    {
    
        ViewModels.DiagramVM vm = null;
        public Diagramer()
        {
            this.InitializeComponent();
            vm = new ViewModels.DiagramVM();
            this.DataContext = vm;
            vm.DiagramUpdated += (s, e) =>
            {                
                DG1.LayoutManager.RefreshFrequency = RefreshFrequency.ArrangeParsing;
            };
    
        }
    
    }
    

    刷新频率行导致重新绘制。也许这会有帮助。

        3
  •  0
  •   okiedev    7 年前

    谢谢你的建议,凯尔·帕特尔。我发现我必须在更新之前清空数据源设置(奇怪)。我将x:Name添加到其示例中的DataSourceSettings(将其命名为DiagramDataSourceSettings)。以下是我添加的内容,以便清除原始节点并使用新节点进行更新:

    diagram.DataSourceSettings = null;
    diagram.DataSourceSettings = DiagramDataSourceSettings;
    diagram.UpdateLayout();
    

    现在的问题是,当更新时,它会将新节点放在右上角(稍微看不见)。