重写ItemsControl

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值