重写ItemsControl

来源:互联网 发布:摩托车改装软件 编辑:程序博客网 时间:2024/05/04 06:18

ItemsControl 是一种数据展示控件,大致分为三个部分组成:Template, ItemTemplate,  ItemsPanel.

所以重写ItemsControl必须要重新定义这三个部分,例如:

<local:CustomCardView Margin="10"                              x:Name="cardView"                              Width="400"                              ItemsSource="{Binding TestDtos}">            <local:CustomCardView.Template>                <ControlTemplate TargetType="local:CustomCardView">                    <ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Disabled"                          ScrollViewer.VerticalScrollBarVisibility="Auto">                        <ItemsPresenter />                    </ScrollViewer>                </ControlTemplate>            </local:CustomCardView.Template>            <local:CustomCardView.ItemsPanel>                <ItemsPanelTemplate>                    <telerik:VirtualizingWrapPanel Margin="0,5,0,5"                                                   ItemHeight="100"                                                   ItemWidth="100" />                </ItemsPanelTemplate>            </local:CustomCardView.ItemsPanel>            <local:CustomCardView.ItemTemplate>                <DataTemplate>                    <Grid Background="AliceBlue"                          Width="100"                          Height="100">                        <TextBlock Text="{Binding Name}" />                    </Grid>                </DataTemplate>            </local:CustomCardView.ItemTemplate>        </local:CustomCardView>

这里CustomCardView继承ItemControl, 必须重写IsItemItsOwnContainerOverride和GetContainerForItemOverride方法,如下:

public class CustomCardView : ItemsControl    {        public static readonly DependencyProperty ViewItemContextMenuProperty = DependencyProperty.Register(             "ViewItemContextMenu",             typeof(TelerikControl.RadContextMenu),             typeof(CustomCardView),             new PropertyMetadata(OnViewItemContextMenuChanged));        public CustomCardView()        {            DefaultStyleKey = typeof(CustomCardView);        }        public TelerikControl.RadContextMenu ViewItemContextMenu        {            get { return (TelerikControl.RadContextMenu)GetValue(ViewItemContextMenuProperty); }            set { SetValue(ViewItemContextMenuProperty, value); }        }        protected override bool IsItemItsOwnContainerOverride(object item)        {            return false;        }        protected override DependencyObject GetContainerForItemOverride()        {            var container = new CardViewItem();            //container.MouseRightButtonUp += new MouseButtonEventHandler(container_MouseRightButtonUp);            return container;        }        private FrameworkElement _itemWithContextMenu = null;        private void container_MouseRightButtonUp(object sender, MouseButtonEventArgs e)        {            ViewItemContextMenu.IsOpen = true;        }        private static void OnViewItemContextMenuChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)        {            CustomCardView control = (CustomCardView)d;            if (e.NewValue != null)            {                TelerikControl.RadContextMenu contextMenu = (TelerikControl.RadContextMenu)e.NewValue;                TelerikControl.RadContextMenu.SetContextMenu(control, (TelerikControl.RadContextMenu)e.NewValue);                contextMenu.Loaded += new RoutedEventHandler(contextMenu_Loaded);            }        }        private static void contextMenu_Loaded(object sender, RoutedEventArgs e)        {            TelerikControl.RadContextMenu menu = (TelerikControl.RadContextMenu)sender;            CardViewItem item = menu.GetClickedElement<CardViewItem>();        }          }


在GetContainerForItemOverride方法中要得到ItemControl的Item的Container,这里我们需要自定义一个CardViewItem,继承ContentControl。

另外,借鉴如下网址:

http://www.cnblogs.com/xiaokang088/archive/2011/04/15/2016719.html

 源代码下载地址:http://download.csdn.net/detail/tianyu0910/4084598

原创粉丝点击