WPF如何使用模板编写可重用的派生控件

时间:2014-06-12 09:58:25

标签: c# .net wpf xaml wpf-controls

我想基于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}}

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

的更多信息