Laden...

UIElement.Effect

Letzter Beitrag vor 15 Jahren 12 Posts 2.190 Views
UIElement.Effect

Hallo!

Mit dem .NET Framework 3.5 SP1 wurden die neuen UIElement Effects eingeführt, um die langsameren BitmapEffects abzulösen. Ich wollte jetzt ein wenig mit diesen neuen Effekten herumspielen. Der folgende Code


<Button Margin="64,32,77,0" Content="Button1" Height="54" VerticalAlignment="Top">
     <Button.Effect>
            <DropShadowEffect ShadowDepth="50" Color="Blue" BlurRadius="50" />
     </Button.Effect>
</Button>

bewirkt allerdings überhaupt nichts, egal welche Werte man für ShadowDepth bzw. BlurRadius einstellt. Es wird kein DropShadow-Effekt erzeugt, der Button behält immer sein Standardaussehen.

Woran könnte das liegen? Ich benutzte VS 2008 Express.

Der folgende Code bewirkt allerdings überhaupt nichts, egal welche Werte man für ShadowDepth bzw. BlurRadius einstellt.

Kann ich nicht bestätigen:

Hmm.
Du benutzt ja Vista. Ich XP SP2. Wird wohl daran liegen.
Danke jedenfalls fürs Testen.

Wird wohl daran liegen.

Darf es aber eigentlich nicht 🤔

Ist dein Fenster auch ausreichend groß? (Jaja - ich weiß. Ist mehr eine obligatorische Frage 😉 )
Zeigt ein BlurEffect Wirkung?
Hast du auch wirklich das SP1 für .NET 3.5 installiert?

laeuft das nicht ueber die shader der graka ?
mach mal dieses Tier >> 16 - eventuell hast du da nur 1 oder 2 dann fehlen ein paar unterstuetzungen (glaub ich)

Danke Euch beiden.

Ist dein Fenster auch ausreichend groß? (Jaja - ich weiß. Ist mehr eine obligatorische Frage Augenzwinkern )
Zeigt ein BlurEffect Wirkung?
Hast du auch wirklich das SP1 für .NET 3.5 installiert?

Fenster ist groß genug, BlurEffect zeigt ebenfalls keine Wirkung. .NET 3.5 SP1 ist installiert.

laeuft das nicht ueber die shader der graka ?
mach mal dieses Tier >> 16 - eventuell hast du da nur 1 oder 2 dann fehlen ein paar unterstuetzungen (glaub ich)

Scheint wohl tatsächlich ein Hardware Problem zu sein. Grafikkarte ist eine GeForce4, nicht mehr up-to-date.
Microsoft setzt also voraus, das man die neueste Hardware hat. Oder man benutzt die BitmapEffects, die allerdings demnächst deprecated sind und nicht mehr unterstützt werden.

Microsoft setzt also voraus, das man die neueste Hardware hat.

Nein.
Deine Karte unterstützt laut der MSDN zumindest Tier 1. Und selbst wenn sie das nicht täte, würde die Anwendung im Softwarerenderingmodus laufen.
Da muss etwas anderes schief laufen:

Siehe auch Graphics Rendering Tiers.

ich glaube mich zu erinnern das ich das selbe phaenomaen auf mein laptop auch habe, das hat nur tier 2 aber ne neuere graka (aber auch nur onboard)
ich mache einfach zu wenig mit effekten und animationen als das ich da was beurteilen kann #gg

Ein ähnliches Problem hatte ich auch einmal.
Da lag es daran, dass mein Windows Media Player zu alt war. warum auch immer die Effekte mit dem WMP zusammenhängen.

Kannst es ja mal testen.

Also wenn es an der Graka liegt kann man bei Effekten grundsätzlich einstellen ob sie ohne Hardwareunterstützung per Software emuliert werden sollen. Wenn man selbst einen Effekt schreibt hat man Zugriff auf das Property System.Windows.Media.Effects.PixelShader.ShaderRenderMode. Meine eigenen Effekte reichen dieses Property nach aussen weiter. Die Default-Effekte von WPF scheinen jedoch den Zugriff darauf zu verbieten. Wenn deine Graka den Effekt nicht unterstützt und der WPF-Standardwert auf HardwareOnly gesetzt ist wird der Effekt einfach nicht angewendet.

Ein ähnliches Problem hatte ich auch einmal.
Da lag es daran, dass mein Windows Media Player zu alt war. warum auch immer die Effekte mit dem WMP zusammenhängen.

Kannst es ja mal testen.

Daran lag es auch nicht. Aber danke für den Hinweis!

Also wenn es an der Graka liegt kann man bei Effekten grundsätzlich einstellen ob sie ohne Hardwareunterstützung per Software emuliert werden sollen.

OK. Was genau muss ich da wo ändern?

Also wenn es an der Graka liegt kann man bei Effekten grundsätzlich einstellen ob sie ohne Hardwareunterstützung per Software emuliert werden sollen.

OK. Was genau muss ich da wo ändern?

Nun es liegt denke ich mal am Flag PixelShader.ShaderRenderMode. Wenn dieses auf HardwareOnly gesetzt ist wird der Effekt wenn er nicht unterstützt wird einfach ignoriert. Wenn man es auf Automatic setzt emuliert es die Software, wenn es nicht unterstützt wird, was allerdings ziemlich langsam ist (wie beim BitmapEffect).

Nur schade dass der DropShaddow-Effect in WPF dieses Flag nicht kapselt und man somit keinen Zugriff darauf hat...
Ich selbst habe mir dafür einen eigenen Shader-Effekt geschrieben.

Um die Theorie zu überprüfen solltest du vielleicht auch mal des RenderingTier des PC abfragen und ob Shader-Version 2.0 unterstütz wird. Versuch mal das:


string info = "Rendering-Tier: " + (RenderCapability.Tier >> 16).ToString()+Environment.NewLine+
"PixelShader V2.0 supported: " + RenderCapability.IsPixelShaderVersionSupported(2, 0).ToString();

EDIT: Manchmal hilft auch ein Update des Grafikkarten-Treibers 😉