it-swarm.com.de

Fügen Sie ein Bild zu einer WPF-Schaltfläche hinzu

Ich habe diese Lösung ausprobiert:

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

Ich kann das Bild jedoch nur im Projektfenster sehen, und wenn ich das Programm starte, verschwindet es.

Wenn ich das versuche:

  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;

Ich erhalte die Ausnahme "System.Windows.Markup.XamlParseException" in PresentationFramework.dll ".

Was ist die Lösung?

49
Marco

Bei einem "fehlenden" Bild sind einige Punkte zu beachten:

  1. Wenn XAML eine Ressource nicht finden kann, wird sie möglicherweise ignoriert (wenn keine XamlParseException ausgegeben wird).

  2. Die Ressource muss ordnungsgemäß hinzugefügt und definiert werden:

    • Stellen Sie sicher, dass es in Ihrem Projekt vorhanden ist, wo erwartet.

    • Stellen Sie sicher, dass es mit Ihrem Projekt als Ressource erstellt wird.

      (Rechtsklick → Eigenschaften → BuildAction = 'Ressource')

Snippet

Eine andere Sache, die Sie in ähnlichen Fällen ausprobieren können, was auch für die Wiederverwendung des Bildes (oder einer anderen Ressource) nützlich ist:

Definiere dein Image als Ressource in deiner XAML:

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

Und später verwenden Sie es in Ihren gewünschten Steuerelementen:

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

Bitte probieren Sie das folgende XAML-Snippet:

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

In XAML befinden sich Elemente in einer Baumstruktur. Daher müssen Sie das untergeordnete Steuerelement dem übergeordneten Steuerelement hinzufügen. Der folgende Code-Ausschnitt funktioniert auch einwandfrei. Geben Sie Ihrem XAML-Stammgitter einen Namen als "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

Benutzen:

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

Es sollte funktionieren. Denken Sie jedoch daran, dass der Ressource in Ihrem Projekt ein Bild hinzugefügt werden muss!

7
Maciek

Sie können den Hintergrund der Schaltfläche auf das Bild einstellen, wenn Sie dann Text überlagern möchten.

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

Achten Sie auf die Bildquellensyntax. Siehe diese Frage um Hilfe.

5
kjhf

Ich hatte auch das gleiche Problem. Ich habe es mit dem folgenden Code behoben.

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

Hinweis: Stellen Sie sicher, dass die Build-Aktion des Bildes im Eigenschaftsfenster Resource ist.

 enter image description here

2
Ali Asad

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

Ich stellte fest, dass ich auch den Access Modifier auf der Registerkarte Resources auf 'Public' setzen musste. Standardmäßig war er auf Internal gesetzt und mein Symbol wurde nur im Entwurfsmodus angezeigt, nicht jedoch beim Ausführen der Anwendung.

0
Robin Bennett