代码之家  ›  专栏  ›  技术社区  ›  Wonko the Sane

来自公共基类的自定义图像按钮和单选/切换按钮

  •  0
  • Wonko the Sane  · 技术社区  · 14 年前

    我想创建一组自定义控件,这些控件基本上是图像按钮(比它复杂一点,但这是我要考虑的基本效果),我已经看到了几个不同的示例。但是,我想进一步扩展它以允许使用单选/切换按钮。

    我想做的是有一个名为ImageButtonBase的公共抽象类,它具有对ImageSource和文本等的默认实现,这使得常规的ImageButton实现非常容易。

    我现在遇到的问题是创建它的RadioButton风格。我认为,至少有三种选择:

    1. 创建从radiobutton派生的东西很容易,但是我不能使用我创建的抽象类。
    2. 我可以将抽象类更改为接口,但随后会丢失抽象类 实现,并且实际上会有代码的重复。
    3. 我可以从抽象类派生并重新实现RadioButton类型 属性和事件(ischecked、groupname等),但这显然不是一个好主意。

    注:我见过 How to get a group of toggle buttons to act like radio buttons in WPF? 但是我想做的有点复杂。

    我只是想知道是否有人有一个实现的例子,或者一些可以适应这种场景的东西。我可以看到上面每个想法的利弊,但每个想法都有潜在的陷阱。

    谢谢, WTS

    1 回复  |  直到 14 年前
        1
  •  1
  •   Ray Burns    14 年前

    我认为您最好的解决方案是使用附加属性而不是子类化。这样你就可以吃蛋糕了。

    不是写这个:

    <my:CustomButton ImageSource="Abc" Text="Def" ... />
    

    你可以写下:

    <Button my:ButtonLook.ImageSource="Abc" my:ButtonLook.Text="Def" ... />
    

    这将适用于数据绑定和所有操作。要实现这一点,请创建从DependencyObject派生的“ButtonLook”类,并使用Visual Studio中的“Propa”片段创建两个附加属性。然后在每个控件上设置一个PropertyChangedCallback,以在附加到的对象上构造更新ContentControl.Content属性。

    另一种解决方案是在CustomRadioButton子类中嵌入隐藏的RadioButton,为其提供空模板以使其不可见,并绑定IsChecked和GroupName属性:

    <ControlTemplate TargetType="my:CustomRadioButton">
      <Grid>
        <RadioButton IsChecked="{Binding ToggleButton.IsChecked, RelativeSource={RelativeSource TemplatedParent}}"
                     GroupName="{TemplateBinding GroupName}">
          <RadioButton.Template><ControlTemplate /></RadioButton.Template>
        </RadioButton>
        ... visual part here ...
    

    确保CustomToggleButton和CustomRadioButton子类使用AddOwner创建DependencyProperties,如IsChecked和GroupName,而不是创建新的属性。