我目前正在使用WPF在C#中开发一个应用程序。我需要做的是在标签上将它们作为标签文本左侧的图像,X的小图像或刻度的小图像,具体取决于具体情况。我将项目中包含的图像放在名为images的文件夹中。
如何在代码中以编程方式分配要放置在标签左侧的图像,而不是使用XAML代码。
答案 0 :(得分: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应该是什么样子,通过代码创建相同的元素非常容易。
答案 1 :(得分:2)
由于你想要在代码背后而不是在XAML中,我建议放弃Label
并使用StackPanel
加上Image
和TextBlock
,如下所示MyGrid
可以是任何容器......
<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);
答案 2 :(得分:1)
我不同意这里的其他两个答案。不需要添加网格来包装内容。 stackpanel就足够了。
在xaml中添加一个stackpanel到你需要内容的位置。
<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.
Drats,但我给了它一个名字。你需要添加
// 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);