| 

.NET C# Java Javascript Exception

5
In Menüs und Symbolleisten werden die Symbole (PNG-Dateien) nicht automatisch ausgegraut, wenn die Befehle nicht verfügbar sind.

Nun habe ich zwar harausgefunden, dass sich das über Style-Trigger lösen lässt, aber die ensprechenen Beispiele setzen lediglich die Opacity-Eigenschaft der Symbole, so dass diese halb durchsichtig sind. Das finde ich etwas unglücklich, denn der Unterschied ist für helle Hintergründe zu klein. Und wenn die Symbole noch durchsichter eingestellt werden, sind sie wiederum auf dunklem Hintergrund praktisch gar nicht mehr zu sehen.

Weiß jemand, wie ich Symbole auf einfache Weise ausgrauen kann, so, wie das bei Windows üblich ist?

Auch, wenn Ihr keine konkrete Lösung für "Graustufen" parat habt, wäre es nett, wenn Ihr sagen könntet, wie Ihr das ansonsten macht.
News:
13.05.2011
Andreas Ganzer 1,4k 1 8
4 Antworten
2
Ich würde ein weiteres Bild hinterlegen, welches vom Design her den Anforderungen entspricht und im Style-Trigger dann die Bilder austauschen.


Edit:

Ich habe hier mal ein Beispiel, wie man es noch machen könnte (Danke für das Stichwort "Gray32Float" @Jaksa)


<ToolBar Height="40">
<Button Command="Save" >
<Image Source="save.png" />
</Button>

<Button IsEnabled="false">
<Image>
<Image.Source>
<FormatConvertedBitmap DestinationFormat="Gray32Float" Source="save.png" />
</Image.Source>
<Image.OpacityMask>
<ImageBrush ImageSource="save.png" />
</Image.OpacityMask>
</Image>
</Button>
</ToolBar>

Vielleicht hilft's ja weiter.
13.05.2011
Mario Priebe 6,0k 3 9
Daran habe ich auch schon gedacht. Das Problem ist nur, das ich dann für jeden Schalter und jeden Menüpunkt je einen eigenen Trigger implementieren müsste. Schießlich haben alle Elemente ein anderes Bild.

Oder gibt es eine Möglichkeit, die ich jetzt nicht sehe?

Anscheinend kann man das Symbol auch nicht mit einem Command verknüpfen und dort austauschen, oder?
Andreas Ganzer 13.05.2011
Sllte aber ein Trigger ausreichen. Kannst das Ganze ja auch generisch machen, Stichworte: Name des Bildes + activ/inactiv ...
Mario Priebe 13.05.2011
Ich hab's mal versucht. Ohne Erfolg.

In einer Toolbar habe ich z.B. so einen Schalter:

<Button Command="ApplicationCommands.Save" >
<Image Source="/MenusAndToolbars;component/Resources/ImgSave24.png"/>
</Button>

Der Resource-Trigger in Window.Resources sieht so aus:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Control}}, Path=IsEnabled}" Value="False">
<Setter Property="Opacity" Value="0.2"/>
</DataTrigger>

Kannst Du mit ein Beispiel geben, wie ich den Pfad des Bildes über diesen Trigger ändern kann?
Andreas Ganzer 13.05.2011
Habe mein Beitrag mal um ein Snippet erweitert. Für die Convertervariante, fehlt mir gerade die Lust (TGIF ;)
Mario Priebe 13.05.2011
1
Also umständlich ist jede Lösung und "gefallen" tut mir gar nichts so recht. Ich hätte erwartet, das Microsoft für solche Selbstverständlichkeiten etwas anbietet.

Wenn man die Lösung, auf die Jaksa unter "Weitere Infos" aufmerksam gemacht hat, einaml implementiert, bringt das m.E. im Nachhinein die meisten Vorteile. Allerdings ist das wieder eine eigene und somit "lokale" Lösung.

Umständlicher (doch dafür unabhängiger) ist der Inline-Trigger von Mario. Aber wegen dieser Unabhängigkeit markiere ich das mal als richtig. Auch wegen der Mühe und Arbeit ;-)
Andreas Ganzer 23.05.2011
1
Zwei Möglichkeiten:
1. Bild tauschen
2. FormatConvertedBitmap Klasse

Weitere Infos: How to gray the icon of a MenuItem ?
13.05.2011
Jaksa 4,0k 1 8
Jaksa 4,0k 1 8
1
Da gibts gleich mehrere Hackentricks, aber die setzen voraus dass Du das Bild in beiden Varianten vorliegen hast...

Das kann man sehr schön mit GPU-ShaderEffekten machen...Ein wirklich gutes Beispiel : http://bursjootech.blogspot.com/2008/06/grayscale-effect-pixel-shader-effect-in.html. Da die Eigenschften der Effekte DependencyProperties sind, kannst Du das sogar animieren (Bsp. auch auf der Seite vorhanden).

Was aber gern als Alternative gemacht wird, ist die Opacity des Bildes mittels Trigger herabzusetzen, wenn der Button disabled ist. Nicht ganz so schön wie ausgegraut, aber versteht auch jeder.
16.06.2011
0
Also wir arbeiten ebenfalls mit solchen Menüs, nur ändern sich bei uns die Funktionalitäten meist nicht. Wir laden jedes Mal, wenn sich das Menü ändert (eine Option dazu kommt oder eine wegfällt), das entsprechende Menü erneut mit dem XAML-Reader.

Hierbei brauch man natürlich nur das Menüitem neu laden. Das gesamte Menü laden wir erst dann neu, wenn es sortiert werden muss oder Elemente wegfallen. Muss aber dazu sagen, dass wir ein eigenes, relativ großes, Framework dahinter haben, welches die Arbeit relativ dynamisch bzw. eher gesagt generisch übernimmt.

Mein Gedankengang war: Einzelne Menütitems als XAML-Code speichern und dann wenn Sie gebraucht werden entsprechend zu einem Menü zusammen basteln und dieses dann mit dem XAML-Reader laden.
13.05.2011
Dustin Klein 2,9k 2 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH