是什么让这个图像显示在我的WPF用户控件中?

时间:2009-07-28 17:33:42

标签: wpf vb.net image user-controls

我一直在尝试创建一个简单的用户控件来显示图像,并最终使其在我的WPF应用程序中充当按钮。

我将其中一个用户控件写入表单的XAML,并始终显示图像。但是,当以编程方式将它们添加到堆栈面板时,控件就在那里,但图像从未显示过。

这是UserControl :(简单,但适用于此示例)

<UserControl x:Class="ImgButton"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    MinHeight="32" MinWidth="32"
    x:Name="uc_ImgButton">
    <Border BorderBrush="Gray" BorderThickness="2">
        <Image Source="{Binding ElementName=uc_ImgButton, Path=Source}" x:Name="img"/>
    </Border>
</UserControl>

我将Source属性设置为ImageSource类型的依赖项属性:

Partial Public Class ImgButton

    Public Property Source() As ImageSource
        Get
            Return GetValue(SourceProperty)
        End Get
        Set(ByVal value As ImageSource)
            SetValue(SourceProperty, value)
        End Set
    End Property

    Public Shared ReadOnly SourceProperty As DependencyProperty = _
                           DependencyProperty.Register("Source", _
                           GetType(ImageSource), GetType(ImgButton))

End Class

以下是我在VB中以编程方式添加它们的示例:

Dim newBtn As New myApp.ImgButton
newBtn.Width = 100
newBtn.Height = 100
Dim bi As New BitmapImage
bi.BeginInit()
bi.UriSource = New Uri("C:\test.png", UriKind.RelativeOrAbsolute)
bi.EndInit()
'MsgBox(bi.Width)  '(a simple debug test I added)
newBtn.Source = bi
Me.StackPanelMain.Children.Add(newBtn)

这是奇怪的部分......上面显示的代码运行没有错误,但我的表单上的结果是一个空边框,里面没有显示图像。

但是,如果取消注释MsgBox行,现在显示图像。就好像它迫使它从BitmapImage中获取一些值使它工作。我也尝试用一些类似于“dim x as integer = bi.PixelWidth”的东西替换MsgBox行,并且还显示了图像。如果我拿走它,我的表格上没有图像。

我怀疑我错过了什么或只是不明白的东西。我想知道发生了什么,而不是在我的应用程序中留下看似毫无意义的代码。

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解您尝试设置的绑定。通常,当您使用ElementName时,这意味着您绑定到同一可视树中的另一个控件。但是,根据ImgButton类的代码示例,它看起来只是一个普通的类。您确定要使用ElementName吗?

另外,我认为为了让课程有DependencyProperty,它必须来自DependencyObject。如果您不想进行此更改,则可以始终实施INotifyPropertyChanged并在PropertyChanged属性的setter中触发Source事件。

更新:我认为部分问题是我误解了您的问题(我没有意识到ImgButton是您的UserControl课程。

无论如何,我不确定这里发生了什么。但是,如果您的属性用于图像文件的路径而不是图像本身,该怎么办?也许是这样的:

XAML:

<UserControl x:Class="ImgButton"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    MinHeight="32" MinWidth="32"
    x:Name="uc_ImgButton">
    <Border BorderBrush="Gray" BorderThickness="2">
        <Image>
            <Image.Source>
                <BitmapImage UriSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=Source}" />
            </Image.Source>
        </Image>
    </Border>
</UserControl>

C#:

Partial Public Class ImgButton

    Public Property Source() As String
        Get
            Return GetValue(SourceProperty)
        End Get
        Set(ByVal value As ImageSource)
            SetValue(SourceProperty, value)
        End Set
    End Property

    Public Shared ReadOnly SourceProperty As DependencyProperty = _
                           DependencyProperty.Register("Source", _
                           GetType(String), GetType(ImgButton))

End Class

然后只需将Source属性设置为图像的路径:

Dim newBtn As New myApp.ImgButton
newBtn.Width = 100
newBtn.Height = 100
newBtn.Source = "C:\test.png"
Me.StackPanelMain.Children.Add(newBtn)

之前我没有使用BitmapImage类,但它可能需要一些东西才能让它渲染图像。我不是为什么你的代码不起作用的原因,但是如果你通过XAML中的绑定设置源代码,它将更像你的原始情况,并且它将起作用。

答案 1 :(得分:0)

就我所知,你不需要用户控制。甚至没有样式按钮。只需将按钮的填充属性设置为图像画笔就可以了。图像按钮:)