добавить изображение на ярлык в wpf? - PullRequest
5 голосов
/ 03 января 2011

В настоящее время я разрабатываю приложение на C # с использованием WPF.Что мне нужно сделать, так это на ярлыке сделать изображение слева от текста ярлыка маленьким изображением X или маленьким изображением галочки в зависимости от обстоятельств.У меня есть изображения, включенные в проект, в папку с именем images.

Как я могу назначить изображения, которые будут размещены слева от метки программно в коде, без использования кода XAML.

Ответы [ 3 ]

4 голосов
/ 03 января 2011

Вы можете сгруппировать это внутри сетки:

<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 голосов
/ 03 января 2011

Поскольку вы хотите это в коде, а не в 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);
1 голос
/ 28 августа 2013

Я не согласен с двумя другими ответами здесь. Нет необходимости добавлять сетку для переноса содержимого. Стеклопанели достаточно.

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...