0

基本的に画像ボタンであるカスタム コントロールのセットを作成したいと思います (それよりも少し複雑ですが、それが私が目指している基本的な効果です)。ただし、これをさらに拡張して、ラジオ/トグル ボタンも使用できるようにしたいと考えています。

私がやりたいのは、ImageSource や Text などのデフォルトの実装を持つ ImageButtonBase という共通の抽象クラスを用意することです。これにより、通常の ImageButton の実装が非常に簡単になります。

私が抱えている問題は、RadioButton フレーバーを作成することです。私が見たところ、少なくとも 3 つのオプションがあります。

  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」スニペットを使用して 2 つの添付プロパティを作成します。次に、それぞれに PropertyChangedCallback を設定して、アタッチされているものの ContentControl.Content プロパティを更新します。

別の解決策は、非表示の RadioButton を CustomRadioButton サブクラス内に埋め込み、空のテンプレートを指定して非表示にし、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 を使用して IsChecked や GroupName などの DependencyProperties を作成するようにしてください。

于 2010-05-12T23:16:54.557 に答える