2011-01-03 10 views
5

私は現在、WPFを使用してC#でアプリケーションを開発中です。私ができる必要があるのは、レーベルのテキストの左側に、Xの小さな画像または状況に応じてダニの小さな画像を表示させるラベルです。私はimagesという名前のフォルダにプロジェクトに含まれる画像を持っています。wpfのラベルにイメージを追加しますか?

XAMLコードを使用せずに、ラベルの左に配置するイメージをプログラムでプログラムに割り当てる方法を教えてください。

答えて

2

あなたはXAML内の後ろではなくコードでこれをしたいので、私は... Labelを捨てるとMyGridは、任意の容器かもしれない場所の下に見られるようにImageTextBlockと相まってStackPanelを使用することをお勧めし

 <Grid Name="MyGrid"/> 

...あなたのコードの背後に...

 StackPanel myStackPanel = new StackPanel(); 
     myStackPanel.Orientation = Orientation.Horizontal; 

     Image myImage = new Image(); 
     BitmapImage myImageSource = new BitmapImage(); 
     myImageSource.BeginInit(); 
     myImageSource.UriSource = new Uri("Images/MyImage.png"); 
     myImageSource.EndInit(); 
     myImage.Source = myImageSource; 

     TextBlock myTextBlock = new TextBlock(); 
     myTextBlock.Text = "This is my image"; 

     myStackPanel.Children.Add(myImage); 
     myStackPanel.Children.Add(myTextBlock); 

     MyGrid.Children.Add(myStackPanel); 
+0

Greate answer !! – CharlieShi

4

次のことができ、いずれの群このグリッド内部:

<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Image Grid.Column="0" Source="{Binding ImageSourceProperty}" /> 
    <Label Grid.Column="1" Content="{Binding LabelTextProperty}" /> 
</Grid> 

あるいは、ラベルは、コンテンツ制御であるため、あなたは単にラベルコントロール内の画像コントロールを配置することができます一度

<Label> 
    <Image Source="{Binding ImageSourceProperty}" /> 
    My Text 
</Label> 

xamlの外観を知っていれば、コードを使って同じ要素を作成するのはとても簡単です。

+2

2番目の例は機能しません。 ContentControlには子が1つしかなく、2つ(Imageとテキスト)を与えています。それらの周りにStackPanelをラップする必要があります。 { ' –

+0

あなたは正しいです。 –

+0

@Joe:あなたのコードは機能しません - タイプ 'String'の値をコレクションまたはUIElementCollectionタイプのコレクションに追加することはできません – Casebash

1

私はここの2つの他の答えに同意しません。コンテンツをラップするためにグリッドを追加する必要はありません。スタックパネルで十分です。

xamlで、コンテンツが必要な場所にスタックパネルを追加します。ボタンハンドラのように背後にあるコードで次に

<StackPanel Name="myStack" Orientation="Horizontal"></StackPanel> 

、またはウィンドウの負荷がこの

Image coolPic = new Image() { 
    Name="pic", 
    Source = new BitmapImage(new Uri("pack://application:,,,/images/cool.png")), 
    Stretch = Stretch.None // this preserves the original size, fill would fill 
}; 

TextBlock text = new TextBlock() { 
    Name = "myText", 
    Text = "This is my cool Pic" 
}; 

myStack.Children.Add(coolPic); // adding the pic first places it on the left 
myStack.Children.Add(text); // the text would show up to the right 

を追加するときは、まずテキストを追加することで、画像の位置やテキストを入れ替えることができます画像。

イメージが表示されない場合は、イメージのビルドアクションがイメージのプロパティウィンドウのリソースに設定されていることを確認してください。

コードをより便利でダイナミックにするためには、テキストまたはイメージを変更する方法が必要です。

は、あなたがそれらを変更したかったと言うことができますし、あなたが先に行くと

((TextBlock)FindName("myText")).Text = "my other cool pic"; 

を行うテキストが変更されることを期待するだろうが、何が起こりますか?

Object reference not set to an instance of an object. 

ドリートだが名前を付けた。

// register the new control 
RegisterName(text.Name, text); 

を追加すると、後からテキストブロックにアクセスできるようになります。これは、フレームワークを作成して表示した後で、フレームワークにコントロールを追加したために必要です。したがって、最終的なコードは画像を登録した後も同様です。

Image coolPic = new Image() { 
    Name="pic", 
    Source = new BitmapImage(new Uri("pack://application:,,,/images/cool.png")), 
    Stretch = Stretch.None // this preserves the original size, fill would fill 
}; 

// register the new control 
RegisterName(coolPic.Name, coolPic); 

TextBlock text = new TextBlock() { 
    Name = "myText", 
    Text = "This is my cool Pic" 
}; 

// register the new control 
RegisterName(text.Name, text); 

myStack.Children.Add(coolPic); 
myStack.Children.Add(text); 
関連する問題