Свойство зависимости строки привязки источника изображения кнопки WPF - PullRequest
0 голосов
/ 16 мая 2018

Это сработало в UWP, но я не могу отобразить изображение с помощью WPF XAML.

Я начинаю с определения UserControl, который привязывает путь к файлу изображения:

<Grid Height="70" Width="70">
    <Border Style="{StaticResource border}">
        <Button Style="{StaticResource button}">
            <Image Source="{Binding prop_image}"/>
        </Button>
    </Border>
</Grid>

Я определяю свойство зависимости как:

public static readonly DependencyProperty prop_image =
DependencyProperty.Register("prop_image_path", typeof(string),
typeof(user_control), null);

public string prop_image_path
{
    get { return (string)GetValue(prop_image); }
    set { SetValue(prop_image, value); }
}

Затем я пытаюсь использовать его как:

<local:user_control Grid.Column="1" Grid.Row="2"
    prop_image_path="/Assets/my.png"/>

, которое точно такое же, как UWP, но с Binding вместо x: bind.когда я создаю кнопку и устанавливаю изображение, оно работает.,,но он не отображает альфа-канал (что, по-моему, означает, что я должен использовать альфа-маску и иметь два файла.), кроме этого, перенести кучу вещей из UWP в WPF XAML было несложно.

1 Ответ

0 голосов
/ 16 мая 2018

Сначала вы используете неправильный путь свойства в {Binding prop_image}, который должен быть {Binding prop_image_path}.Поскольку эта Binding находится в XAML UserControl с одним из его собственных свойств, вы также должны указать исходный объект Binding как экземпляр UserControl, например:

<Image Source="{Binding prop_image_path,
                RelativeSource={RelativeSource AncestorType=UserControl}}"/>

Кроме того, WPFСистема свойств зависимостей требует, чтобы вы придерживались соглашений об именах для поля идентификатора свойства зависимостей.

Оно должно называться как свойство с суффиксом Property:

public static readonly DependencyProperty prop_image_pathProperty =
    DependencyProperty.Register(
        "prop_image_path",
         typeof(string),
         typeof(user_control),
         null);

Вы также можете заметитьчто ваша схема именования немного необычна.Согласно общепринятым соглашениям, имена типов и свойств C # / .NET должны использовать Pascal Casing, то есть

public class MyUserControl
{
    public static readonly DependencyProperty ImagePathProperty =
        DependencyProperty.Register(
            nameof(ImagePath),
            typeof(string),
            typeof(MyUserControl));

    public string ImagePath
    {
        get { return (string)GetValue(ImagePathProperty); }
        set { SetValue(ImagePathProperty, value); }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...