it-swarm.com.ru

Добавить изображение в кнопку WPF

Я попробовал это решение:

<Button>
    <StackPanel>
        <Image Source="Pictures/img.jpg" />
        <TextBlock>Blablabla</TextBlock>
    </StackPanel>
</Button>

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

Если я попробую это:

  Image img = new Image();
  img.Source = new BitmapImage(new Uri("foo.png"));

  StackPanel stackPnl = new StackPanel();
  stackPnl.Orientation = Orientation.Horizontal;
  stackPnl.Margin = new Thickness(10);
  stackPnl.Children.Add(img);

  Button btn = new Button();
  btn.Content = stackPnl;

Я получаю исключение "System.Windows.Markup.XamlParseException" в PresentationFramework.dll ".

Каково решение?

49
Marco

В случае «отсутствующего» изображения необходимо учитывать несколько факторов:

  1. Когда XAML не может найти ресурс, он может его игнорировать (когда он не генерирует XamlParseException)

  2. Ресурс должен быть правильно добавлен и определен:

    • Убедитесь, что он существует в вашем проекте, где ожидается.

    • Убедитесь, что он построен с вашим проектом в качестве ресурса.

      (Правый клик → Свойства → BuildAction = 'Ресурс')

Snippet

Еще одна вещь, которую можно попробовать в подобных случаях, что также полезно для повторного использования изображения (или любого другого ресурса):

Определите ваше изображение как ресурс в вашем XAML:

<UserControl.Resources>
     <Image x:Key="MyImage" Source.../>
</UserControl.Resources>

И позже используйте его в желаемых элементах управления:

<Button Content="{StaticResource MyImage}" />
66
Ron.B.I

Пожалуйста, попробуйте приведенный ниже фрагмент XAML:

<Button Width="300" Height="50">
  <StackPanel Orientation="Horizontal">
    <Image Source="Pictures/img.jpg" Width="20" Height="20"/>
    <TextBlock Text="Blablabla" VerticalAlignment="Center" />
  </StackPanel>
</Button>

В XAML элементы находятся в древовидной структуре. Таким образом, вы должны добавить дочерний элемент управления в родительский элемент управления. Приведенный ниже фрагмент кода также работает нормально. Дайте имя для вашей корневой сетки XAML как «MainGrid».

Image img = new Image();
img.Source = new BitmapImage(new Uri(@"foo.png"));

StackPanel stackPnl = new StackPanel();
stackPnl.Orientation = Orientation.Horizontal;
stackPnl.Margin = new Thickness(10);
stackPnl.Children.Add(img);

Button btn = new Button();
btn.Content = stackPnl;
MainGrid.Children.Add(btn);
25
Vimal CK

Использование:

<Button Height="100" Width="100">
  <StackPanel>
    <Image Source="img.jpg" />
    <TextBlock Text="Blabla" />
  </StackPanel>
</Button>

Он должен работать. Но помните, что у вас должно быть изображение, добавленное к ресурсу вашего проекта!

7
Maciek

Вы можете установить фон кнопки на изображение, если затем хотите наложить текст.

<Button>
   <Button.Background>
     <ImageBrush ImageSource="/AssemblyName;component/Pictures/img.jpg"/>
   </Button.Background>
   <TextBlock>Blablabla</TextBlock>
</Button>

Не упустите синтаксис источника изображения. Смотрите этот вопрос для помощи.

5
kjhf

У меня тоже была такая же проблема. Я исправил это с помощью следующего кода.

        <Button Width="30" Margin="0,5" HorizontalAlignment="Stretch"  Click="OnSearch" >
            <DockPanel>
                <Image Source="../Resources/Back.jpg"/>
            </DockPanel>
        </Button>

Примечание: Убедитесь, что действие сборки изображения в окне свойств должно быть Resource.

 enter image description here

2
Ali Asad

Попробуйте ContentTemplate:

<Button Grid.Row="2" Grid.Column="0" Width="20" Height="20"
        Template="{StaticResource SomeTemplate}">
    <Button.ContentTemplate>
        <DataTemplate>
            <Image Source="../Folder1/Img1.png" Width="20" />
        </DataTemplate>
    </Button.ContentTemplate>
</Button>
2
yu yang Jian

Я обнаружил, что мне также пришлось установить Access Modifier на вкладке Ресурсы на «Public» - по умолчанию он был установлен на Internal, и мой значок появлялся только в режиме разработки, но не при запуске приложения.

0
Robin Bennett