WPF架构关键技术剖析(3)--做自己的交互Action(3)

1)测试数据准备:

//这是我学习treeview绑定时用的,也随带给不是很会用treeview绑定的网友们一个例子.
A)层级类,树形结构.

public class Folder
    {
        public ObservableCollection<Folder> Children { get; set; }
        public string A { get; set; }
        public string B { get; set; }
    }

B) 一个简单的ViewModel

 public class MainViewModel : ViewModelBase
    {
        public string Welcome
        {
            get
            {
                return "Welcome to MVVM Light";
            }
        }
       
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            if (IsInDesignMode)
            {
                // Code runs in Blend --> create design time data.
            }
            else
            {
                LoadData();
                // Code runs "for real"
            }
        }
        public void LoadData()
        {
            ObservableCollection<Folder> theFolders = new ObservableCollection<Folder>();
            Folder theFolder = new Folder()
            {
                A = "A",
                B = "1001",
                Children = new ObservableCollection<Folder>() {
                 new Folder(){A="B1",B="101",Children= new ObservableCollection<Folder>(){
                  new Folder(){A="C1",B="10101"},
                  new Folder(){A="C2",B="10102"},
                 }},
                new Folder(){A="B2",B="102",Children= new ObservableCollection<Folder>(){
                  new Folder(){A="C3",B="10201"},
                  new Folder(){A="C4",B="10202"},
                 }},
                 new Folder(){A="B3",B="103"},
                 new Folder(){A="B4",B="104"},
                }
              
            };
            theFolders.Add(theFolder);
            theFolder = new Folder()
            {
                A = "B",
                B = "20",
                Children = new ObservableCollection<Folder>() {
                 new Folder(){A="B4",B="201",Children= new ObservableCollection<Folder>(){
                  new Folder(){A="C1",B="20101"},
                  new Folder(){A="C2",B="20102"},
                 }},
                new Folder(){A="B5",B="202",Children= new ObservableCollection<Folder>(){
                  new Folder(){A="C3",B="20201"},
                  new Folder(){A="C4",B="20202"},
                 }},
                 new Folder(){A="B6",B="203"},
                 new Folder(){A="B7",B="204"},
                }

            };
            theFolders.Add(theFolder);
            this.Folders = theFolders;
        }
        private ObservableCollection<Folder> _Folders;
        public ObservableCollection<Folder> Folders
        {
            get
            {
                return _Folders;
            }
            set
            {
                if (_Folders != value)
                {
                    _Folders = value;
                    RaisePropertyChanged("Folders");
                }
            }
        }
        public override void Cleanup()
        {
            // Clean up if needed

            base.Cleanup();
        }
    }

 

2)下面是页面:

<UserControl x:Class="MvvmLight1.MainPage"
             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:MvvmLight1" <!-- 这里是定义命名空间-->
             mc:Ignorable="d"
             Height="300"
             Width="300"
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
             xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
             DataContext="{Binding Main, Source={StaticResource Locator}}"
             xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <UserControl.Resources>

       <!-- TreeView的模板-->
        <sdk:HierarchicalDataTemplate x:Key="FolderTemplate" ItemsSource="{Binding Children}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.3*"></ColumnDefinition>
                    <ColumnDefinition Width="0.7*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Path=A}"></TextBlock>
                <TextBox Grid.Column="1" Text="{Binding Path=B}"></TextBox>
            </Grid>

        </sdk:HierarchicalDataTemplate>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">

        <TextBlock FontSize="36"
                   FontWeight="Bold"
                   Foreground="Purple"
                   Text="{Binding Welcome}"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   TextWrapping="Wrap" />
        <sdk:TreeView ItemsSource="{Binding Path=Folders}" ItemTemplate="{StaticResource FolderTemplate}"  HorizontalAlignment="Stretch" Margin="0,0,0,0" Name="treeView1" VerticalAlignment="Stretch" SelectedItemChanged="treeView1_SelectedItemChanged" >
            <!--<i:Interaction.Behaviors> 这里是用微软的behavior做.
                <local:MyBehavior Params="hello,tian" TargetName="treeView1" MethodName="TreeViewSelected" />
            </i:Interaction.Behaviors>-->


<!-- 这里是用我们刚才定义的Action框架实现交互TreeViewSelected选择方法定义在本页的.cs中见后面的代码,注意myactiontest的参数,这些参数在解析过程中最终会变成对应属性的值..-->
            <local:WPFTestDettach.MyObjects>
                <local:MyActionTest EventName="SelectedItemChanged"  Params="hello,1" TargetName="" MethodName="TreeViewSelected" MyName="xxx1"></local:MyActionTest>
                <local:MyActionTest EventName="SelectedItemChanged"  Params="hello,2" TargetName="" MethodName="TreeViewSelected" MyName="xxx2"></local:MyActionTest>
                <local:MyActionTest EventName="SelectedItemChanged" Params="hello,3" TargetName="" MethodName="TreeViewSelected" MyName="xxx3"></local:MyActionTest>
                <local:MyActionTest EventName="SelectedItemChanged"  Params="hello,4" TargetName="" MethodName="TreeViewSelected" MyName="xxx4"></local:MyActionTest>
            </local:WPFTestDettach.MyObjects>
        </sdk:TreeView>
    </Grid>
</UserControl>

3)xaml.cs

 public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
           
        }        public void TreeViewSelected(string Params)
        {
            MessageBox.Show(Params);
        }
    }

 

4)我利用微软的behaviors实现,MyBehavior 继承自Behavior<>,大家可以对比一下,很多代码都比较类似.

 public class MyBehavior : Behavior<TreeView>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(AssociatedObject_SelectedItemChanged);
        }

        void AssociatedObject_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            DoSomething(Params);
        }
        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.SelectedItemChanged -= new RoutedPropertyChangedEventHandler<object>(AssociatedObject_SelectedItemChanged);
       
        }
        public string Params { get; set; }
        public string TargetName { get; set; }
        public string MethodName { get; set; }
        public void DoSomething(string PMs)
        {

            object theRootObj = GetRootObject(this.AssociatedObject);
            object theTargetObj = null;
            if (TargetName == "")
            {
                theTargetObj = theRootObj;
            }
            else
            {
                theTargetObj = ((FrameworkElement)theRootObj).FindName(TargetName);
            }
            MyActionCollection theValue = (MyActionCollection)((DependencyObject)theTargetObj).GetValue(WPFTestDettach.MyObjectsProperty);
            foreach (var item in theValue)
            {
                string a = item.MyName;
            }
            MethodInfo[] theMIs = theTargetObj.GetType().GetMethods();
            MethodInfo theMI = theTargetObj.GetType().GetMethod(MethodName,BindingFlags.NonPublic);
            if (theMI != null)
            {
                theMI.Invoke(theTargetObj, null);
            }
           
        }
        private FrameworkElement GetRootObject(FrameworkElement obj)
        {
            if (obj.Parent != null && obj.Parent is FrameworkElement)
            {
                return GetRootObject((FrameworkElement)(obj.Parent));
            }
            return obj;
        }
    }

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF是一种创建Windows应用程序的框架,它提供了许多可视化组件和工具,使得应用程序的创建变得更加容易和快捷。本次实例的项目是一个简单的点餐系统,它包含了以下几个主要模块: 1. 登录界面 用户需要输入用户名和密码才能成功登录,登录成功后,程序将跳转到订单界面。如果用户输入的用户名或密码不正确,则会提示错误信息。 2. 菜单界面 在菜单界面,用户可以查看所有可供选择的菜品列表,并可以选择需要点的菜品。每个菜品都可以显示它的描述、价格以及图片,用户可以在右侧的“购物车”中查看他们已经点的菜品以及总价。 3. 订单界面 订单界面用于显示用户已经点的菜品信息以及订单的总价。用户在确认购物车中的菜品信息无误后,可以点击“去结算”按钮,进入支付界面。 4. 支付界面 在支付界面,用户需要选择支付方式并输入对应的支付信息,如信用卡号、有效期和验证码等。支付成功后,程序将返回订单界面并提示用户支付成功。 通过使用WPF的鲁棒性、可扩展性和易用性,开发者可以在编写这样的小项目时得到很大的好处。开发者可以使用大量的分层和组件化方法,使他们的代码变得易于管理和扩展。此外,通过使用WPF的数据绑定和样式,开发者可以使程序的UI更加一致和响应式。总的来说,使用WPF编写点餐系统可以使开发者轻松地创建一个功能齐全、易于使用并具有良好用户体验的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值