Ресурс изображения в качестве источника для изображения не отображается - PullRequest
0 голосов
/ 18 июня 2019

Я определил пользовательский загрузочный счетчик UserControl в библиотеке WPF UserContol.У него есть одно свойство зависимости:

public string SpinnerSourcePath { get => _spinner.Source.ToString(); set => _spinner.Source = (ImageSource)new ImageSourceConverter().ConvertFromString(value); }

public static readonly DependencyProperty SpinnerSourcePathProperty =
            DependencyProperty.Register(nameof(SpinnerSourcePath), typeof(string), typeof(Spinner));

, где _spinner - это Image.
(я пробовал напрямую с классом ImageSource, но без кубиков)

xamlвыглядит следующим образом:

<Image x:Name="_spinner" RenderTransformOrigin="0.5 0.5">
    <SomeStyleToMakeItRotate.../>
</Image>

, и я использую его, определяя его следующим образом:
<c:Spinner SpinnerSourcePath="/Test;component/_Resources/loading.png"/>
(имя проекта Test, элемент управления Spinner находится в другом проекте), ничего не отображается.

Однако, если я добавлю свойство Source непосредственно в определение Spinner:

<Image x:Name="_spinner" Source="/Test;component/_Resources/loading.png" RenderTransformOrigin="0.5 0.5">
    <SomeStyleToMakeItRotate.../>
</Image>

оно будет отображаться правильно ...

Это заставляет меня поверить, что свойство зависимости неверно, но как?

E1:

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

На этот раз у меня DP:

public static readonly DependencyProperty ValidationFunctionProperty =
    DependencyProperty.Register(nameof(ValidationFunction), typeof(Func<string, bool>), typeof(ValidatedTextBox), new PropertyMetadata(OnAssignValidation));

public Func<string, bool> ValidationFunction {
    get => (Func<string, bool>)GetValue(ValidationFunctionProperty);
    set => SetValue(ValidationFunctionProperty, value);
}

private static void OnAssignValidation(DependencyObject d, DependencyPropertyChangedEventArgs e) {
    Debugger.Break();
}

Управление использованием:

<c:ValidatedTextBox x:Name="valid"
                    Text="Test"
                    ValidationFunction="{Binding Validation, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource test}}"/>

Преобразователь представляет собой Debugger.Break() и возвращает оригинал

И, наконец,RelativeSource контроль - мой MainWindow

public MainWindow() {
    InitializeComponent();
}

public Func<string,bool> Validation => (s) => true;

(есть проблема и с Text DP, но я думаю, что могу решить ее самостоятельно)

E2

Ok Pro проблема была в RelativePath, указывающей на UserControl, но она была помещена в Window

1 Ответ

1 голос
/ 18 июня 2019

Ваше объявление свойства зависимости неверно, потому что методы get / set оболочки свойства CLR должны вызывать методы GetValue и SetValue базового класса DependencyObject (и ничего более).

Кроме того, свойство должно также использовать ImageSource в качестве типа:

public static readonly DependencyProperty SpinnerSourceProperty =
    DependencyProperty.Register(
        nameof(SpinnerSource), typeof(ImageSource), typeof(Spinner));

public ImageSource SpinnerSource
{
    get { return (ImageSource)GetValue(SpinnerSourceProperty); }
    set { SetValue(SpinnerSourceProperty, value); }
}

Элемент Image в XAML UserControl будет использовать это свойство следующим образом:

<Image Source="{Binding SpinnerSource,
                RelativeSource={RelativeSource AncestorType=UserControl}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...