2009-07-28 17 views
0

私はイメージを表示する単純なusercontrolを作って、最終的にはWPFアプリケーションのボタンとして動作させようとしています。この画像をWPFのユーザコントロールに表示するにはどうすればいいですか?

これらのユーザーコントロールの1つがフォームのXAMLに書き込まれ、イメージが常に表示されました。しかし、プログラムをスタックパネルに追加すると、コントロールはそこにありましたが、イメージは表示されませんでした。 (シンプルですが、この例のために働く)私はImageSourceは型の依存関係プロパティとしてSourceプロパティを設定

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

:ここ

はUserControlのここ

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からいくつかの価値を得るように強制するのと同じように動作します。私はまた、MsgBoxラインを "dim x as integer = bi.PixelWidth"のような無知なものに置き換えようとしました。そして、ALSOは画像を表示しました。私はそれを取り除くと、私のフォーム上にイメージはありません。

私は何かが不足していると思うか、何か分かりません。私はアプリで一見無意味なコード行を残すのではなく、何が起こっているのかを知りたい。

答えて

0

私が知っている限り、このためにユーザーコントロールは必要ありません。スタイリッシュなボタンでもありません。ボタンのfillプロパティをImage Brushに設定するだけです。画像ボタン:)

0

設定しようとしているバインディングを理解しているかどうかわかりません。通常はElementNameを使用すると、同じビジュアルツリー内の別のコントロールにバインドすることを意味します。しかし、あなたのImgButtonクラスのコードサンプルに基づいて、それは普通のクラスであるように見えます。 ElementNameを使用してもよろしいですか?

また、クラスがDependencyPropertyを持つためには、DependencyObjectから派生する必要があります。変更したくない場合は、INotifyPropertyChangedを実装し、プロパティのセッターでPropertyChangedイベントを発生させることができます。

更新:私は、問題の一部は、私は(私は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) 

Iの避難所」前にBitmapImageクラスを使用していましたが、何かが順番にかかる可能性がありますイメージをレンダリングすることができます。私は本当にあなたのコードがうまくいかない理由ではありませんが、XAMLのバインディングを使用してソースを設定すると、元のケースに似ています。

+0

私のWPF体験のこの時点で、私の仕事の多くは、私がオンラインで見つけたコードスニペットに基づいています。私は、その中に表示されている画像を変更するために設定できるプロパティを持つusercontrolがほしいだけです。これを実現するためのよりよい方法があれば、有料で無料で共有してください。私は学びたい:-)私はあなたの提案を理解していません...サンプルコードが役に立ちます。 –

+0

余分なコードをありがとう、私は周りに遊びます。私は、データバインディングステートメントをXAMLでどのように記述するべきか、特定のバインド方法を使用するのが適切であるかどうかを理解することは常に困難でした。 –

+0

ハングアップするにはしばらく時間がかかります。 VS2010では、マークアップの拡張(バインディングを含む)のためのインテリセンスがありますので、うまくいけば学習曲線に役立ちます。 – Andy

関連する問題