2015-08-17 10 views
9

In WPF, programmiere ich programmgesteuert ein Kontextmenü zu einem Steuerelement.Warum nur der letzte Menüpunkt Symbol hat?

var contextMenu = new ContextMenu(); 
    contextMenu.Items.Add(new MenuItem { Header = "Copy All", Icon = FindResource("CopyImage") }); 
    contextMenu.Items.Add(new MenuItem { Header = "Copy All with Headers", Icon = FindResource("CopyImage") }); 
    contextMenu.Items.Add(new MenuItem { Header = "Copy Selected", Icon = FindResource("CopyImage") }); 
    contextMenu.Items.Add(new MenuItem { Header = "Copy Selected with Headers", Icon = FindResource("CopyImage") }); 

CopyImage ist in meiner Anwendung Ressource definiert.

<Image x:Key="CopyImage" Source="../Images/copy.png"/> 

Zur Laufzeit wird nur das letzte Menüelement angezeigt. Die anderen drei Menüpunkte nicht.

enter image description here

Hat jemand für dieses Verhalten eine Erklärung?

+0

Sie die Definition von 'CopyImage' zeigen kann? –

+0

Hallo, @NathanA, hinzugefügt nach Ihrer Anfrage. Vielen Dank. –

Antwort

7

Werfen Sie einen Blick auf diese article.

Es wird erläutert, dass ein Bild nur an einer Stelle gleichzeitig verwendet werden kann. Das würde erklären, warum es nur zu der letzten Aufgabe kam, die du im Code gemacht hast. Definieren Sie stattdessen ein BitmapImage, und erstellen Sie dann ein neues Bild, das BitmapImage als die Quelle für jedes Menüelement verwendet.

Aus anderen Artikel:

Um dies zu tun, erstellen Sie eine Bitmapsource als Ressource irgendwo:

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" /> 

Dann in Ihrem Code verwenden, so etwas wie:

<Image Source="{StaticResource MyImageSource}" /> 
+0

Ich habe das gleiche Problem. Ich habe versucht, eine 'TextBox' anstelle eines Bildes in die Eigenschaft' Icon' zu legen ... das gleiche Problem. –

4

Jedes UI-Element kann nur an einer Stelle im visuellen Baum platziert werden. Sie können nicht dasselbe Image-Steuerelement für mehrere MenuItems verwenden. Sie müssen für jedes MenuItem separate Image-Steuerelemente erstellen. Andernfalls wird jedes Mal, wenn Sie es einem neuen MenuItem zuweisen, nur von einem zum nächsten verschoben.

<Image x:Key="CopyImage1" Source="../Images/copy.png"/> 
<Image x:Key="CopyImage2" Source="../Images/copy.png"/> 
<Image x:Key="CopyImage3" Source="../Images/copy.png"/> 
<Image x:Key="CopyImage4" Source="../Images/copy.png"/> 

var contextMenu = new ContextMenu(); 
    contextMenu.Items.Add(new MenuItem { Header = "Copy All", Icon = FindResource("CopyImage1") }); 
    contextMenu.Items.Add(new MenuItem { Header = "Copy All with Headers", Icon = FindResource("CopyImage2") }); 
    contextMenu.Items.Add(new MenuItem { Header = "Copy Selected", Icon = FindResource("CopyImage3") }); 
    contextMenu.Items.Add(new MenuItem { Header = "Copy Selected with Headers", Icon = FindResource("CopyImage4") }); 
3

Versuchen Sie, diese , Icon = new BitmapImage(new Uri("images/copy.png", UriKind.Relative))

var contextMenu = new ContextMenu(); 
contextMenu.Items.Add(new MenuItem { Header = "Copy All", Icon = new BitmapImage(new Uri("images/copy.png", UriKind.Relative)) }); 
contextMenu.Items.Add(new MenuItem { Header = "Copy All with Headers", Icon = new BitmapImage(new Uri("images/copy.png", UriKind.Relative)) }); 
contextMenu.Items.Add(new MenuItem { Header = "Copy Selected", Icon = new BitmapImage(new Uri("images/copy.png", UriKind.Relative)) }); 
contextMenu.Items.Add(new MenuItem { Header = "Copy Selected with Headers", Icon = new BitmapImage(new Uri("images/copy.png", UriKind.Relative)) }); 
0

Alle Antworten waren hilfreich. Hier ist, was ich tun, landete auf der Grundlage der Zeiger von @NathanA:

var contextMenu = new ContextMenu(); 
contextMenu.Items.Add(new MenuItem 
{ 
    Header = "Copy All", 
    Icon = new Image {Source = FindResource("CopyImageSource") as ImageSource} 
}); 
contextMenu.Items.Add(new MenuItem 
{ 
    Header = "Copy All with Headers", 
    Icon = new Image {Source = FindResource("CopyImageSource") as ImageSource} 
}); 
contextMenu.Items.Add(new MenuItem 
{ 
    Header = "Copy Selected", 
    Icon = new Image {Source = FindResource("CopyImageSource") as ImageSource} 
}); 
contextMenu.Items.Add(new MenuItem 
{ 
    Header = "Copy Selected with Headers", 
    Icon = new Image {Source = FindResource("CopyImageSource") as ImageSource} 
}); 

und dies in der Ressource-Wörterbuch:

<BitmapImage x:Key="CopyImageSource" UriSource="../Images/copy.png"/> 
Verwandte Themen