Page tree
Skip to end of metadata
Go to start of metadata

1.描述

基于内置的超链接编辑器设置,您可以定制一个对话框来编辑复杂的属性。

查看完整代码请参见:https://gitee.com/huozige-china/edit-panel-content-command

2.自定义属性编辑器

操作步骤

  先创建好一个对话框,如下所示:

  创建一个命令来打开对话框。

public class EditPanelContentCommand : ICommand
    {
        private Window _window;

        private IEditorSettingsDataContext _dataContext;

        private PanelEditorControl _control;

#pragma warning disable CS0067
        public event EventHandler CanExecuteChanged;
#pragma warning restore CS0067
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            _dataContext = parameter as IEditorSettingsDataContext;

            //init the dialog data based on the property value.
            _control = new PanelEditorControl();
            _control.ViewModel.Model = _dataContext?.Value as List<PanelContentInfo>;
            var buttonControl = new StackPanel() { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 5, 5, 10) };
            var okButton = new Button() { Content = "OK", Width = 80 };
            okButton.Click += OkButton_Click;
            var cancelButton = new Button() { Content = "Cancel", Width = 80, Margin = new Thickness(8, 0, 0, 0) };
            cancelButton.Click += CancelButton_Click;
            buttonControl.Children.Add(okButton);
            buttonControl.Children.Add(cancelButton);

            var grid = new Grid();
            grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
            grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
            grid.Children.Add(_control);
            grid.Children.Add(buttonControl);
            Grid.SetRow(_control, 0);
            Grid.SetRow(buttonControl, 1);

            _window = new Window();
            _window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            _window.Title = "Set Panel Content";
            _window.Width = 680d;
            _window.Height = 400d;
            _window.Content = grid;
            _window.ShowDialog();
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            _window.Close();
        }

        private void OkButton_Click(object sender, RoutedEventArgs e)
        {
            _dataContext.Value = _control.ViewModel.Model;
            _window.Close();
        }
    }

其中活字格自定义的接口IEditorSettingsDataContext定义如下:

/// <summary>
/// Property context and can get the value and editor of property.
/// </summary>
public interface IEditorSettingsDataContext
{
    /// <summary>
    /// The property value.
    /// </summary>
    object Value { get; set; }
 
    /// <summary>
    /// The property editor.
    /// </summary>
    EditorSetting EditorSetting { get; set; }
}

  给CellType类型添加Designer并重写GetEditorSetting并指定编辑器为超链接编辑器。

[Designer("EditPanelContentCommand.CollapsePanelDesigner, EditPanelContentCommand")]
    public class CollapsePanel : CellType
    {
        public CollapsePanel()
        {
            PanelContents = new List<PanelContentInfo>();
            PanelContents.Add(new PanelContentInfo() { Title = "Title1", Content = "Content1", Name = "Panel1" });
            PanelContents.Add(new PanelContentInfo() { Title = "Title2", Content = "Content2", Name = "Panel2" });
        }
        public List<PanelContentInfo> PanelContents
        {
            get;
            set;
        }

        public CollapseMode CollapseMode
        {
            get; set;
        }

    }

    public class CollapseMode
    {
    }

    public class PanelContentInfo : PropertyChangedObjectBase
    {
        private string _title;
        public string Title
        {
            get => _title;
            set
            {
                if (_title != value)
                {
                    this._title = value;
                    this.OnPropertyChanged();
                }
            }
        }

        private string _content;

        public string Content
        {
            get => _content;
            set
            {
                if (_content != value)
                {
                    this._content = value;
                    this.OnPropertyChanged();
                }
            }
        }

        private string _name;

        public string Name
        {
            get => _name;
            set
            {
                if (_name != value)
                {
                    this._name = value;
                    this.OnPropertyChanged();
                }
            }

        }
        public override string ToString()
        {
            return Name;
        }

        public PanelContentInfo Clone()
        {
            return new PanelContentInfo
            {
                Title = this.Title,
                Name = this.Name,
                Content = this.Content
            };
        }
    }

    public class CollapsePanelDesigner : CellTypeDesigner<CollapsePanel>
    {
        public override EditorSetting GetEditorSetting(PropertyDescriptor property, IBuilderContext builderContext)
        {
            switch (property.Name)
            {
                case nameof(CollapsePanel.PanelContents):
                    return new HyperlinkEditorSetting(new EditPanelContentCommand());
                default:
                    return base.GetEditorSetting(property, builderContext);
            }
        }
    }


重新构建工程并重启设计器,效果如下。


回到顶部

  • No labels