创建自定义Silverlight控件

时间:2011-08-10 16:19:52

标签: silverlight xaml

我们正在尝试制作一个自定义控件,其中包含绑定到列表中的每个项目的文本框的包装部分。

像这样:

<ItemsControl x:Name="asdf">
 <ItemsControl.ItemsPanel>
  <ItemsPanelTemplate>
   <controls:WrapPanel />
  </ItemsPanelTemplate>
 </ItemsControl.ItemsPanel>
 <ItemsControl.ItemTemplate>
  <DataTemplate>
   <TextBox Text="{Binding}" />
  </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>

但是,当我们将其转换为自定义控件时,它不会将ItemsPanel设置为WrapPanel,也不会将ItemTemplate设置为:

<ItemsControl x:Class="SilverlightApplication1.PillTagBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls= "clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit">

 <ItemsControl.ItemsPanel>
  <ItemsPanelTemplate>
   <controls:WrapPanel />
  </ItemsPanelTemplate>
 </ItemsControl.ItemsPanel>
 <ItemsControl.ItemTemplate>
  <DataTemplate>
   <TextBox Text="{Binding}" />
  </DataTemplate>
 </ItemsControl.ItemTemplate>

</ItemsControl>

它只显示项目的绑定列表,例如根本没有样式:

<ItemsControl x:Name="asdf" />

我们如何将第一块XAML变成自定义控件?

谢谢!

1 个答案:

答案 0 :(得分:2)

对于你想要做的事情,你不需要自定义控件,风格就足够了:

<Style x:Key="MyControlStyle" TargetType="ItemsControl">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <controls:WrapPanel/>
            </ItemsPanelTemplate>
        </Setter.Value>  
    </Setter>
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBox Text="{Binding}" />
            </DataTemplate>
        </Setter.Value>  
    </Setter>
</Style>

然后在实例:

<ItemsControl x:Name="asdf" Style="{StaticResource MyControlStyle}" />

如果您出于其他原因需要自定义控件:

  1. 使用Silverlight Control Library模板创建一个新项目(所有定义都在此项目中)。
  2. 如果没有Themes文件夹,请将其添加到项目的根目录,并在Themes文件夹中创建一个名为Generic.xaml的新ResourceDictionary文件。
  3. 创建一个新类,继承自ItemsControl(让我们称之为MyItemsControl)。
  4. 添加如下构造函数:

    public MyItemsControl() { this.DefaultStyleKey = typeof(MyItemsControl); }

  5. 将上面的样式添加到Generic.xaml文件中,删除x:Key属性并将TargetType更改为MyItemsControl(您需要为本地名称空间添加xmlns定义)。
  6. 现在返回到您的客户端项目,引用Control Library项目。
  7. 在相应的Page \ UserControl xaml文件中添加xmlns定义,并将MyItemsControl用作任何其他ItemsControl。