0

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

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

我遇到的问题是创建它的 RadioButton 风格。在我看来,至少有三个选择:

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

注意:我已经看到如何让一组切换按钮像 WPF 中的单选按钮一样工作?,但我想做的事情要复杂一些。

我只是想知道是否有人有一个实现的例子,或者可能适合这种场景的东西。我可以看到上述每个想法的优缺点,但每个想法都有潜在的陷阱。

谢谢,wTS

4

1 回答 1

1

我认为您最好的解决方案是使用附加属性而不是子类化。这将允许你有你的蛋糕并吃掉它。

而不是这样写:

<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,而不是创建新的。

于 2010-05-12T23:16:54.557 回答