我一直在尝试创建一个简单的用户控件来显示图像,并最终使其在我的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行,并且还显示了图像。如果我拿走它,我的表格上没有图像。
我怀疑我错过了什么或只是不明白的东西。我想知道发生了什么,而不是在我的应用程序中留下看似毫无意义的代码。
答案 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)
就我所知,你不需要用户控制。甚至没有样式按钮。只需将按钮的填充属性设置为图像画笔就可以了。图像按钮:)