当前位置: 代码网 > it编程>编程语言>C# > C#属性显示的实现示例

C#属性显示的实现示例

2024年05月15日 C# 我要评论
功能:显示对象的属性,包括可显示属性、可编辑属性、及不可编辑属性。1、mainwindow.xaml<window x:class="flowchart.mainwindow" x

功能:

显示对象的属性,包括可显示属性、可编辑属性、及不可编辑属性。

1、mainwindow.xaml

<window x:class="flowchart.mainwindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:flowchart"
        mc:ignorable="d"
        title="mainwindow" height="450" width="800">
    <dockpanel>
        <stackpanel dockpanel.dock="left" width="300" margin="0 0 10 0">
            <stackpanel margin="0 10 0 10">
                <textblock text="属性" fontweight="bold" margin="0 0 0 10"/>
                <local:propertiesview x:name="_propertiesview" height="200"/>
            </stackpanel>
        </stackpanel>
        <border borderbrush="black" borderthickness="1"></border>
    </dockpanel>
</window>

2、mainwindow.cs

using system;
using system.collections.generic;
using system.componentmodel;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows;
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;

namespace flowchart
{
    /// <summary>
    /// mainwindow.xaml 的交互逻辑
    /// </summary>
    public partial class mainwindow : window
    {
        public mainwindow()
        {
            initializecomponent();
            datainitialize();
        }

        public list<selection> selections=new list<selection>();
        public void datainitialize()
        {
            selection selection = new selection();
            selection.location=new point(0,0);
            selection.size=new size(200,200);
            //selection.name = "测试";
            _propertiesview.selectedobject= selection;
        }
    }

    public class selection:inotifypropertychanged
    {
        private point _location;
        public point location
        {
            get { return _location; }
            set
            {
                _location = value;
                onpropertychanged("location");
            }
        }

        private size _size;
        //[browsable(false)]
        public size size
        {
            get { return _size; }
            set
            {
                _size = value;
                onpropertychanged("size");
            }
        }

        private string _name="test";
        
        public string name
        {
            get { return _name; }
            //set { _name = value;
            //    onpropertychanged("name");
            //}
        }


        public override string tostring()
        {
            return gettype().name;
        }

        public event propertychangedeventhandler propertychanged;

        protected void onpropertychanged(string name)
        {
            if (propertychanged != null)
                propertychanged(this, new propertychangedeventargs(name));
        }
    }
}

3、propertiesview.xaml

<usercontrol x:class="flowchart.propertiesview"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:flowchart"
             mc:ignorable="d" 
             d:designheight="450" d:designwidth="300">
    <usercontrol.resources>
        <controltemplate x:key="validationerrortemplate">
            <dockpanel>
                <image source="resources\empty.png" height="16" width="16" dockpanel.dock="right" margin="-18 0 0 0"
                       tooltip="{binding elementname=adorner,path=adornedelement.(validation.errors)[0].errorcontent}">
                </image>
                <adornedelementplaceholder x:name="adorner"/>
            </dockpanel>
        </controltemplate>

        <style x:key="gridlinestyle" targettype="line">
            <setter property="stroke" value="gray" />
            <setter property="stretch" value="fill" />
            <setter property="grid.zindex" value="1000" />
        </style>

        <style x:key="gridhorizontallinestyle" targettype="line" basedon="{staticresource gridlinestyle}">
            <setter property="x2" value="1" />
            <setter property="verticalalignment" value="bottom" />
            <setter property="grid.columnspan"
                value="{binding 
                            path=columndefinitions.count,
                            relativesource={relativesource ancestortype=grid}}"/>
        </style>

        <style x:key="gridverticallinestyle" targettype="line" basedon="{staticresource gridlinestyle}">
            <setter property="y2" value="1" />
            <setter property="horizontalalignment" value="right" />
            <setter property="grid.rowspan" 
                value="{binding 
                            path=rowdefinitions.count,
                            relativesource={relativesource ancestortype=grid}}"/>
        </style>
    </usercontrol.resources>

    <border borderthickness="1" borderbrush="black">
        <dockpanel x:name="_panel">
            <border x:name="_label" width="50" height="16">
                <textblock text="empty" textalignment="center" foreground="gray"/>
            </border>
            <scrollviewer x:name="_gridcontainer" verticalscrollbarvisibility="auto">
                <grid x:name="_grid">
                    <grid.columndefinitions>
                        <columndefinition/>
                        <columndefinition/>
                    </grid.columndefinitions>

                    <line name="_vline" grid.column="0" grid.rowspan="1000" style="{staticresource gridverticallinestyle}"/>
                    <gridsplitter name="_splitter" grid.rowspan="1000"  margin="0,0,-2,0" width="4" 
                                  background="white" opacity="0.01" grid.zindex="10000"/>

                </grid>
            </scrollviewer>
        </dockpanel>
    </border>
</usercontrol>

4、propertiesview.cs

using system;
using system.collections.generic;
using system.componentmodel;
using system.linq;
using system.reflection;
using system.text;
using system.threading.tasks;
using system.windows;
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;

namespace flowchart
{
    /// <summary>
    /// propertiesview.xaml 的交互逻辑
    /// </summary>
    public partial class propertiesview : usercontrol
    {
        public propertiesview()
        {
            initializecomponent();
            displayproperties();
        }

        private object _selectedobject;
        public object selectedobject
        {
            get { return _selectedobject; }
            set
            {
                if (_selectedobject != value)
                {
                    var obj = _selectedobject as inotifypropertychanged;
                    if (obj != null)
                        obj.propertychanged -= propertychanged;

                    _selectedobject = value;
                    displayproperties();

                    obj = _selectedobject as inotifypropertychanged;
                    if (obj != null)
                        obj.propertychanged += propertychanged;
                }
            }
        }

        void propertychanged(object sender, propertychangedeventargs e)
        {
            displayproperties();
        }

        private void displayproperties()
        {
            _panel.children.clear();
            cleargrid();
            if (selectedobject != null)
            {
                int row = 0;
                foreach (var prop in selectedobject.gettype().getproperties().orderby(p => p.name))
                {
                    var attr = prop.getcustomattributes(typeof(browsableattribute), true);
                    if (attr.length == 0 || (attr[0] as browsableattribute).browsable)
                    {
                        displayproperty(prop, row);
                        row++;
                    }
                }
                _panel.children.add(_gridcontainer);
            }
            else
            {
                _panel.children.add(_label);
            }
        }

        private void cleargrid()
        {
            _grid.rowdefinitions.clear();
            for (int i = _grid.children.count - 1; i >= 0; i--)
            {
                if (_grid.children[i] != _vline && _grid.children[i] != _splitter)
                    _grid.children.removeat(i);
            }
        }

        private void displayproperty(propertyinfo prop, int row)
        {
            var rowdef = new rowdefinition();
            rowdef.height = new gridlength(math.max(20, this.fontsize * 2));
            _grid.rowdefinitions.add(rowdef);

            var tb = new textblock() { text = prop.name };
            tb.margin = new thickness(4);
            grid.setcolumn(tb, 0);
            grid.setrow(tb, _grid.rowdefinitions.count - 1);

            var ed = new textbox();
            ed.previewkeydown += new keyeventhandler(ed_keydown);
            ed.margin = new thickness(0, 2, 14, 0);
            ed.borderthickness = new thickness(0);
            grid.setcolumn(ed, 1);
            grid.setrow(ed, _grid.rowdefinitions.count - 1);

            var line = new line();
            line.style = (style)resources["gridhorizontallinestyle"];
            grid.setrow(line, row);

            var binding = new binding(prop.name);
            binding.source = selectedobject;
            binding.validatesonexceptions = true;
            binding.mode = bindingmode.oneway;
            ed.isenabled = false;
            if (prop.canwrite)
            {
                ed.isenabled = true;
                var mi = prop.getsetmethod();
                if (mi != null && mi.ispublic)
                    binding.mode = bindingmode.twoway;
            }
            ed.setbinding(textbox.textproperty, binding);

            var template = (controltemplate)resources["validationerrortemplate"];
            validation.seterrortemplate(ed, template);

            _grid.children.add(tb);
            _grid.children.add(ed);
            _grid.children.add(line);
        }

        void ed_keydown(object sender, keyeventargs e)
        {
            var ed = sender as textbox;
            if (ed != null)
            {
                if (e.key == key.enter)
                {
                    ed.getbindingexpression(textbox.textproperty).updatesource();
                    e.handled = true;
                }
                else if (e.key == key.escape)
                    ed.getbindingexpression(textbox.textproperty).updatetarget();
            }
        }

    }
}

5、运行结果

在这里插入图片描述

到此这篇关于c#属性显示的实现示例的文章就介绍到这了,更多相关c#属性显示内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com