WPF子类Control无需添加逻辑,只是为了能够自定义样式和模板?

时间:2015-07-06 20:28:54

标签: wpf controltemplate

我正在寻找一种在WPF中创建可样式,可重复使用的控件的好方法。例如,我有一个推文可能看起来像这样(非常简化):

<ItemsControl ItemsSource={Binding tweets}>
   <ItemsControl.DataTemplate>
      <DataTemplate TargetType="tweet">
         <StackPanel>
            <Image Source="{Binding user.image}" />
            <TextBlock Text="{Binding text}" />
         </StackPanel>
      </DataTemplate>
   </ItemsControl.DataTemplate>
</ItemsControl>

为了使其成为可重用的控件,我可以将它放在UserControl中。但这样做会使得无法改变图像部分的显示方式。

所以我现在所做的就是为用户的图像创建一个控件,如下所示:

public class UserImage : Control
{
   // Empty class..
}

<Style TargetType="{x:Type UserImage}">
   <Setter Property="Template">
     <Setter.Value>
       <ControlTemplate TargetType="{x:Type UserImage}">
          <Image Source="{Binding}" />
       </ControlTemplate>
     </Setter.Value>
   </Setter>
</Style>

// The itemscontrol datatemplate now looks like this
<DataTemplate TargetType="tweet">
   <StackPanel>
      <UserImage DataContext="{Binding user.image}" />
      <TextBlock Text="{Binding text}" />
   </StackPanel>
</DataTemplate>

现在我可以做这样的事情来自定义用户图像的外观:

<Style TargetType="{x:Type UserImage}" BasedOn="{StaticResource {x:Type UserImage}}">
   <Setter Property="Template">
     <Setter.Value>
       <ControlTemplate TargetType="{x:Type UserImage}">
          <Ellipse>
             <Ellipse.Fill>
               <ImageBrush ImageSource="{Binding}">
             </Ellipse.Fill>
          </Ellipse>
       </ControlTemplate>
     </Setter.Value>
   </Setter>
</Style>

即使这样可行,但它确实感觉有点低效,而且......错误地必须创建一个&#34;空&#34;控制自定义控件中的每个组件。这是要走的路,还是有更清洁的方式?

0 个答案:

没有答案