Gdybym miał płótno z liczbą obiektów wizualnych dowolnego kształtu lub rozmiaru, w jaki sposób programowo zaznaczałem/kontur obiektu Visual?Jak mogę podświetlić/obrysować obiekt wizualny w WPF?
Czy coś jest wbudowane w WPF, aby mi pomóc?
Gdybym miał płótno z liczbą obiektów wizualnych dowolnego kształtu lub rozmiaru, w jaki sposób programowo zaznaczałem/kontur obiektu Visual?Jak mogę podświetlić/obrysować obiekt wizualny w WPF?
Czy coś jest wbudowane w WPF, aby mi pomóc?
Po przeczytaniu komentarzy w drugiej odpowiedzi - w której oświadczasz, że chcesz, aby kontur był zgodny z kształtem wizualnym - mogę tylko zasugerować, abyś spojrzał na BitmapEffects
. Jest jeden na efekt blasku zewnętrznego.
Samo duplikowanie wizualizacji byłoby prawdopodobnie mniej wydajne i prawdopodobnie spowodowałoby wiele komplikacji ze względu na inne aspekty tych elementów, takie jak wszelkie wiązania.
Edit: W .NET 4.0, BitmapEffects
własności i klasy BitmapEffect
są przestarzałe. Dostaniesz wyjątek. Zamiast tego masz teraz klasę System.Windows.Media.Effects.Effect
i jej klasy pochodne oraz właściwości, takie jak Visual.VisualEffect
.
Jeśli zawiniesz te obiekty Wizualne w Obramowanie ... i domyślnie utworzysz Opacity 0, to możesz programowo obrócić Krycie do 1, gdy zajdzie taka potrzeba.
Czy to pomaga?
Czy obrzeże zawsze będzie prostokącie, czy będzie ono miało kształt leżącego pod nim obiektu? – Dylan
Aby odpowiedzieć na moje własne pytanie, granica pozostanie kwadratem. Chociaż to może zadziałać, szukam, aby kontur był taki sam jak obiekt wizualny. – Dylan
W takim przypadku można po prostu skopiować wizualną (lub zewnętrzną, nieprostokątną część wizualną), ale nadać jej nieco większą szerokość i trochę więcej wysokości (tak, aby wyglądała jak obramowanie). a następnie, oczywiście, użyć sztuczki Krycie powyżej? Czy to działa? – cplotts
Joel ma świetną sugestię na temat używania BitmapEffects.
Jednakże, jeśli możesz używać .NET 3.5 SP1, poprowadzę Cię w stronę GPU renderowanych efektów. Tak więc, zamiast używać UIElement.BitmapEffect, używałbyś UIElement.Effect. .NET 3.5 SP1 ma wbudowane dwa efekty GPU: BlurEffect i DropShadowEffect. Możesz także tworzyć własne efekty GPU ... i tutaj możesz użyć ShaderEffect.
Aby uzyskać więcej informacji, odwiedź blog na blogu Grega Schechtera: series.
Oto fragment kodu dla myszy nad mocą, że właśnie wdrożyliśmy kilka dni temu (faktycznie pojawia się coś w rodzaju zewnętrznej efekt poświata bitmapy powodu do ShadowDepth jest 0, ale nie dokładnie):
<Path
x:Name="mouseOverEffect"
Width="80"
Height="43.916"
Stretch="None"
Fill="#FFFFFFFF"
Opacity="0"
>
<Path.Data>
<PathGeometry FillRule="Nonzero">
<PathFigure IsClosed="True" StartPoint="39.9592899612151,25.9913931634531">
<LineSegment Point="80.0000001464848,43.9159987905149"/>
<LineSegment Point="39.9513899394755,4.97379893856246E-14"/>
<LineSegment Point="1.77635636294422E-15,43.9159987905149"/>
<LineSegment Point="39.9592899612151,25.9913931634531"/>
</PathFigure>
</PathGeometry>
</Path.Data>
<Path.Effect>
<DropShadowEffect
Color="#FFFFFFFF"
BlurRadius="10"
ShadowDepth="0"
/>
</Path.Effect>
</Path>
Niestety, nie jestem w stanie używać dodatku SP1, ponieważ niektórzy z naszych klientów są w bardzo ograniczonym (tj. Rządowym) otoczeniu. – Dylan
lol, właśnie to wymyśliłem i właśnie miałem to opublikować. Chyba masz przedstawiciela. – Dylan
Whee. Cieszę się, że szukałeś w odpowiednich miejscach. :) –
Niezła sugestia, nie wiem, dlaczego nie pomyślałem o tym wcześniej ... zwłaszcza, że niedawno zrobiłem mysz nad efektem. Jedną z rzeczy, które należy zwrócić uwagę na BitmapEffects, jest to, że są one znanym problemem z wydajnością. Więc uważaj na to. –
cplotts