WPF的自定义控件 依赖属性,DependencyProperty 路由事件RoutedEvent

起初,想添加TreeView的样式,在MouseOver时整行背景变色,但是我目前在XAML无法实现.

搜索了一下,有个方法在后台也要写代码.

参考:http://www.cnblogs.com/bray/archive/2010/05/01/1725457.html

用这个办法可以解决样式问题,但是不能方便的复用,就想到做成UserControl.

在UserControl里放入一个TreeView,需要 依赖属性ItemsSource 和 路由事件SelectedItemChanged

参考:http://www.cnblogs.com/zhouyinhui/archive/2007/10/27/939920.html

以下是我的部分代码

UCTreeView.xaml

View Code
<TreeView  x:Name="treeview1"  SelectedItemChanged="treeview1_SelectedItemChanged" Background="{x:Null}" />

UCTreeView.xaml.cs

View Code
 #region 属性依赖

        public static readonly DependencyProperty ItemsSourceProperty =
            DependencyProperty.Register("ItemsSource"typeof(IEnumerable), 
            typeof(UCTreeView),
            new PropertyMetadata(null,new PropertyChangedCallback(OnItemsSourceChanged)));
          
        public IEnumerable ItemsSource
        {
            get { return (IEnumerable)GetValue(ItemsSourceProperty); }

            set { SetValue(ItemsSourceProperty, value); }
        } 

        static void OnItemsSourceChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            if (sender != null && sender is UCTreeView)
            {
                UCTreeView source = (UCTreeView)sender;
                source.treeview1.ItemsSource = (IEnumerable)args.NewValue;
            }
             
        }
        #endregion

        #region 事件路由

        public static readonly RoutedEvent SelectedItemChangedEvent =
            EventManager.RegisterRoutedEvent("SelectedItemChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<object>), typeof(UCTreeView));

        [Description("选择项改变后发生")]
        public event RoutedPropertyChangedEventHandler<object> SelectedItemChanged
        {
            add
            {
                this.AddHandler(SelectedItemChangedEvent, value);
            }

            remove
            {
                this.RemoveHandler(SelectedItemChangedEvent, value);
            }
        }

        public void OnSelectedItemChanged(object oldValue, object newValue)
        {
            RoutedPropertyChangedEventArgs<object> arg =
                new RoutedPropertyChangedEventArgs<object>(oldValue, newValue, SelectedItemChangedEvent); 
            this.RaiseEvent(arg); 
        }

        private void treeview1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
               OnSelectedItemChanged((object)e.OldValue, (object)e.NewValue);

        }

        #endregion
原文地址:https://www.cnblogs.com/star250/p/2353680.html