图像资源作为图像不显示的来源

时间:2019-06-18 09:16:00

标签: c# wpf image

我在WPF UserContol库中定义了一个自定义加载微调器UserControl。 它具有一个依赖项属性:

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));

其中_spinnerImage
(我直接在ImageSource类中尝试过,但没有骰子)

xaml看起来像这样:

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

我通过定义它来使用它,例如:
<c:Spinner SpinnerSourcePath="/Test;component/_Resources/loading.png"/>
(项目名称为TestSpinner控件位于其他项目中),什么也不显示。

但是,如果我直接在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 个答案:

答案 0 :(得分:1)

您的依赖项属性声明是错误的,因为CLR属性包装器的get / set方法必须调用DependencyObject基类的GetValueSetValue方法(没什么)。

除此之外,该属性还应该使用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); }
}

UserControl的XAML中的Image元素将使用如下属性:

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