我想基于ListView
创建一个可重复使用的控件。这个派生的ListView
与原始ContentPresenter
完全相同,只不过它在每一行(<Style x:Key="MyListViewStyle" TargetType="{x:Type MyListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MyListViewItem}">
<Grid>
...
<ToggleButton .../>
<Border ...>
<ContentPresenter .../>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
之外)都有一个按钮。
如果我使用XAML来定义我的控件,那么我就无法将此控件添加到窗口的XAML中,并添加资源等内容,因为它们已经被定义。
这样做的正确方法是什么?
我想要应用以下样式:
<MyListView DataContext="{StaticResource MyDataSource}" ItemsSource="{Binding Items}">
<MyListView .ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Width="32" Height="32" Source="{Binding Image}" />
<TextBlock Text="{Binding Text}" />
</StackPanel>
</DataTemplate>
</MyListView.ItemTemplate>
<MyListView.Resources>
<Style TargetType="{x:Type MyListViewItem}">
<Setter Property="IsChecked" Value="{Binding IsChecked, Mode=TwoWay}" />
</Style>
</MyListView.Resources>
</MyListView>
但是如何应用它,并且能够在我的Window的XAML中使用该控件?我需要能够像这样更改默认模板,因为我希望控件的最终用户能够通过ContentPresenter向每行添加他们喜欢的任何控件。
Microsoft如何为每个控件应用默认样式?
我正在尝试编写一个封装控件,最终用户不需要知道内容模板(控件与应用程序分开组装)。 这就是我想要使用我的控件的方式:
{{1}}
答案 0 :(得分:1)
让我们开始使用默认模板部署自定义控件
创建一个类库项目
根据需要在项目中添加必要的自定义控件
将资源字典添加到项目
将文件命名为generic.xaml并放置在themes文件夹
在这里阅读为什么名称generic.xaml很重要 http://social.msdn.microsoft.com/Forums/vstudio/en-US/641a1f97-271f-4f86-a670-8b3a0a8d8d9f/what-is-so-special-about-genericxaml
例如
<ResourceDictionary>
<Style TargetType="{x:Type MyListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MyListViewItem}">
<Grid>
...
然后你需要通过类库项目的assemblyinfo.cs中的ThemeInfo属性指定默认的字典位置
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
所以这个属性将决定在哪里寻找样式资源
编译项目并引用目标应用程序中的输出库,并将所需的自定义控件放到窗口或其他用户控件中,并查看从源程序集中拾取的默认样式
例如
<MyListView DataContext="{StaticResource MyDataSource}" ItemsSource="{Binding Items}"/>
有关ThemeInfo属性http://msdn.microsoft.com/en-us/library/system.windows.themeinfoattribute(v=vs.110).aspx
的更多信息