Как использовать другое свойство зависимости в качестве запасного значения - PullRequest
0 голосов
/ 28 марта 2019

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

Xaml:

   <ToggleButton IsChecked="{Binding Checked, Mode=TwoWay}">
        <Image>
            <Image.Style>
                <Style TargetType="Image">
                    <Setter Property="Source" Value="{Binding CheckedImage}"></Setter>
                        <DataTrigger Binding="{Binding IsChecked}" Value="False">
                            <Setter Property="Source" Value="{Binding UncheckedImage}"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>
    </ToggleButton>

Код:

public partial class ImageToggleButton : UserControl
{
    public ImageToggleButton()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public bool Checked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set { SetValue(IsCheckedProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsChecked.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsCheckedProperty =
        DependencyProperty.Register("Checked", typeof(bool), typeof(ImageToggleButton), null);



    public ImageSource CheckedImage
    {
        get { return (ImageSource)base.GetValue(TrueStateImageProperty); }
        set { base.SetValue(TrueStateImageProperty, value); }
    }

    // Using a DependencyProperty as the backing store for TrueStateImage.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TrueStateImageProperty =
        DependencyProperty.Register("CheckedImage", typeof(ImageSource), typeof(ImageToggleButton), null);



    public ImageSource UncheckedImage
    {
        get { return (ImageSource)base.GetValue(FalseStateImageProperty); }
        set { base.SetValue(FalseStateImageProperty, value); }
    }

    // Using a DependencyProperty as the backing store for FalseStateImage.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty FalseStateImageProperty =
        DependencyProperty.Register("UncheckedImage", typeof(ImageSource), typeof(ImageToggleButton), null);
}

MainWindow:

   <ImageToggleButton Checked="{Binding IsPlaying}" CheckedImage="{DynamicResource PauseIcon}" UncheckedImage="{DynamicResource PlayIcon}">
    </ImageToggleButton>

Можно ли использовать CheckedImage в качестве изображения по умолчанию, чтобы, если я не предоставляю UncheckedImage, тогда и в отмеченном, и в непроверенном состоянии будет отображаться CheckedImage?

1 Ответ

1 голос
/ 28 марта 2019

Вы можете зарегистрировать PropertyChangedCallback для свойства CheckedImage, которое устанавливает значение другого:

public static readonly DependencyProperty TrueStateImageProperty =
    DependencyProperty.Register("CheckedImage", typeof(ImageSource), typeof(ImageToggleButton),
        new PropertyMetadata(new PropertyChangedCallback(OnPropChanged)));

private static void OnPropChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ImageToggleButton tb = (ImageToggleButton)d;
    if (tb.UncheckedImage == null)
        tb.UncheckedImage = (ImageSource)e.NewValue;
}

Кстати, вы должны следовать правилам именования свойств зависимостей: https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/custom-dependency-properties

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...