65.9K
CodeProject 正在变化。 阅读更多。
Home

玩转控件模板

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.30/5 (5投票s)

2009年11月16日

CPOL

3分钟阅读

viewsIcon

24514

downloadIcon

339

介绍如何为任何常规控件提供自定义外观和行为。

Snapshot

引言

本文介绍了如何更改控件的 controltemplate,并通过向其添加新的依赖属性和 RoutedEventHandler 进一步说明。

背景

当开始使用WPF时,经常需要给控件一个新的外观和感觉,也许还需要添加一些新的自定义功能。一些例子包括让一个按钮的行为像一个combobox;按下为选中,未按下为未选中。许多这些需求可以通过以不同的方式设计控件来实现。我遇到一个比这稍微复杂的需求。

这是我们需要的:在应用程序的首次设置中,有很多屏幕。其中一个绑定到列表的组合框,需要在其下拉选择列表中显示一个按钮。在这里添加这个按钮的目的是让用户可以动态地向绑定列表添加项目(而无需查找并转到可以向该列表添加项目的屏幕)。我希望这个解决方案在整个应用程序中可重用,无论我们绑定到哪个列表。因此,例如,如果有一个组合框显示一个学生列表,那么在列表的底部将有一个文本为“添加新学生”的按钮。当用户点击它时,我们可以启动一个“新学生”弹出窗口。所以这个按钮应该能够根据它所在的组合框做不同的事情。

Using the Code

注意依赖属性 EnableNewItemAddition,它使我们的特殊按钮可见且可用。依赖属性 AddNewItemText 允许您指定您可能想在按钮中看到的文本。RouterEventHandler AddNewItemButtonClicked 允许您决定当点击我们 combobox 中的这个按钮时,您想做什么。

 <local:EnhancedComboBox x:Name="eComboBox"MinWidth="300" Margin="5,0,0,0"
            ItemsSource="{Binding CharlieCollection}"
            EnableNewItemAddition="True" 
            AddNewItemText="Add a new value" 
            AddNewItemButtonClicked="EnhancedComboBox_AddNewItemButtonClicked" 
            DisplayMemberPath="Name">         

关注点

这是如何做到的。一旦你学会了这两个简单的步骤,你应该就能改变任何控件的 ControlTemplate。因此能够做所有那些有趣的事情,比如让一个按钮看起来像一个radiobutton,或者让一个checkbox 看起来像一个按钮并有类似的行为。

步骤 1:在谷歌上搜索关键词“ControlTemplate ComboBox xaml”。 当然,您可以自由选择您的特定控件而不是 ComboBox。 第一个结果是MSDN上的这个链接 :-)

步骤 2:下一步是将此 ControlTemplate 添加到您的 XAML 资源中。 然后你可以开始使用这里的 ControlTemplate 的内容,也许可以玩弄触发器,并注意外观和行为的变化。

请注意,这是我从 Microsoft 网站复制过来后,在 ControlTemplate 中所做的唯一更改。 所以就这么简单。(是的,我也添加了一些触发器)

<ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
	<!--This line is replaced by the DockPanel below-->
	<!--<StackPanel IsItemsHost="True" 
	KeyboardNavigation.DirectionalNavigation="Contained" />-->
  	<DockPanel ...>
</ScrollViewer>

所以在新的 DockPanel 中,我们添加了常规的组合框内容以及包含我们特殊按钮的新 ComboBoxItem

以及更多细节!

好的,我同意在我的示例代码中,事情有点复杂,因为除了 Control Template 中的微小更改之外,我还从基本控件派生了一个控件,然后添加了三个新的依赖属性和一个路由事件处理程序。 这有助于我们实现自定义功能。 因此,在使用它时,我们所要做的就是设置自定义文本并将一个方法附加到我们的路由事件处理程序。

历史

  • 版本 1.0:初稿
  • 版本 n.0:添加了关于代码的更多解释!
© . All rights reserved.