WPF子类控件没有添加逻辑,只是为了能够自定义样式和模板?

WPF子类控件没有添加逻辑,只是为了能够自定义样式和模板?,wpf,controltemplate,Wpf,Controltemplate,我正在寻找一种在WPF中创建可风格化、可重用控件的好方法。例如,我有一个twitter提要,看起来像这样(非常简单): 为了使它成为一个可重用的控件,我可以将它放在一个UserControl中。但是仅仅这样做就不可能改变图像部分的显示方式 所以我现在要做的是为用户的图像创建一个控件,如下所示: public class UserImage : Control { // Empty class.. } <Style TargetType="{x:Type UserImage}"&

我正在寻找一种在WPF中创建可风格化、可重用控件的好方法。例如,我有一个twitter提要,看起来像这样(非常简单):


为了使它成为一个可重用的控件,我可以将它放在一个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>
public类用户映像:控件
{
//空类。。
}
//itemscontrol数据模板现在如下所示
现在我可以这样做来定制用户图像的外观:

<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>


尽管这样做有效,但它确实感觉有点低效,而且很好。。。必须为自定义控件中的每个组件创建“空”控件是错误的。这是要走的路,还是有更干净的路?

结尾处不是您获得的图像。创建自定义控件的目的是什么?我需要一些东西来放置自定义控件模板,所以我认为自定义控件类型可以做到这一点。但我确信有更好的方法?我不确定您想要获得什么,但您可以使用ContentControl,将内容绑定到img。Source和在ContentTemplate中设置其外观(elipse或任何内容)。从ItemsControl继承,这样您可以定义默认的ItemTemplate和样式,但仍然可以在任何需要的地方自定义ItemTemplate。
<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>