重写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
- 重写ItemsControl
- ItemsControl Class
- ItemsControl 解析
- ItemsControl 解析
- ItemsControl使用
- ItemsControl A~Z----深入了解ItemsControl
- ItemsControl 的来龙去脉
- ItemsControl 的使用,经典
- ItemsControl.GetContainerForItemOverride 方法
- WPF(ContentControl和ItemsControl)
- WPF(Binding of ItemsControl)
- ItemsControl 之template
- WPF/silverlight ItemsControl 解析
- ItemsControl 类绑定数据库
- WPF下Itemscontrol分组 样式
- 获取ItemsControl里面的控件
- 巧用WrapPanel为ItemsControl绑定数据
- ControlTemplate in WPF —— ItemsControl
- 浙大计算机研究生复试上机考试-2010年 .
- VLC configure的portaudio错误解决方案
- jQuery层次选择器
- ruby入门_case
- NYOJ 92 图像有用区域
- 重写ItemsControl
- android游戏引擎andengine学习系列六:Physics物理碰撞效果理解
- 使用LINQPad学习LINQ
- JS判断文本框输入的包含字母,数字,汉字,但输入的时候必须有汉字
- 费控测试数据删除方法
- 在eclipse中部署发布web项目 和 更改eclipseweb项目发布的路径
- 修改Jkstatus登录密码
- 软件架构师应该知道的97件事
- jquery、jquery+ajax