Пользовательская кнопка изображения и радио / кнопка переключения из общего базового класса - PullRequest
0 голосов
/ 10 мая 2010

Я хотел бы создать набор пользовательских элементов управления, которые в основном представляют собой кнопки изображений (это немного сложнее, но это основной эффект, которого я добиваюсь), для которого я видел несколько разных примеров. Тем не менее, я хотел бы дополнительно расширить это, чтобы также разрешить радио / переключатели.

То, что я хотел бы сделать, это иметь общий абстрактный класс ImageButtonBase, который имеет реализации по умолчанию для ImageSource и Text и т. Д. Это делает обычную реализацию ImageButton довольно простой.

У меня проблема с созданием аромата RadioButton. На мой взгляд, есть как минимум три варианта:

  1. Было бы легко создать нечто, производное от RadioButton, но тогда я не смогу использовать созданный мной абстрактный класс.
  2. Я мог бы изменить абстрактный класс на интерфейс, но затем я потерял абстрактный реализации, и на самом деле будет иметь дублирование кода.
  3. Я мог бы наследовать свой абстрактный класс и заново реализовать тип RadioButton свойства и события (IsChecked, GroupName и т. д.), но это определенно не кажется хорошей идеей.

Примечание: я видел Как заставить группу переключателей действовать как переключатели в WPF? , но то, что я хочу сделать, немного сложнее.

Мне просто интересно, есть ли у кого-нибудь пример реализации или что-то, что может быть адаптировано к этому сценарию. Я вижу плюсы и минусы каждой из вышеперечисленных идей, но у каждой есть потенциальные подводные камни.

Спасибо, WTS

1 Ответ

1 голос
/ 13 мая 2010

Я думаю, что ваше лучшее решение здесь - это использовать вложенные свойства вместо подклассов. Это позволит вам съесть свой торт и съесть его тоже.

Вместо написания этого:

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

Вы бы написали это:

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

Это будет работать с привязкой данных и всем прочим. Чтобы реализовать это, создайте класс «ButtonLook», производный от DependencyObject, и создайте два прикрепленных свойства, используя фрагмент «propa» в Visual Studio. Затем установите 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 для создания свойств DependencyProperties, таких как IsChecked и GroupName, а не для создания новых.

...