Przeźroczystość elementu, bez przeźroczystości content'u

0

Marzy mi się zrobienie buttona, który wyglądałby tak jak menu po lewej stronie pod tym linkiem: http://www.wpftutorial.net/Home.html . O co chodzi... Menu to jest częściowo przeźroczyste, a mimo to tekst znajdujący się w tym menu widać dokładnie, bez przeźroczystości. Jak to osiągnąć w WPF? Ustawienie właściwości opacity buttona sprawia że jego content(np. tekst, ikonka), również jest słabiej widoczny. Proszę o wskazówki.

0

Też mi się spodobały buttony na tej stronie i wydziergałem coś podobnego, może Ci się przyda:

 
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Color x:Key="PodstawowyNiebieskiKolor">#003399</Color>
    <Color x:Key="PodstawowySzaryKolor">#3e402c</Color>
    <SolidColorBrush x:Key="PodstawowyNiebieskiBrush" Color="{StaticResource ResourceKey=PodstawowyNiebieskiKolor}" />
    <SolidColorBrush x:Key="PodstawowySzaryBrush" Color="{StaticResource ResourceKey=PodstawowySzaryKolor}" />
    <LinearGradientBrush x:Key="PodstawowyNiebieski-Nic" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Color="{StaticResource ResourceKey=PodstawowyNiebieskiKolor}" Offset="0"/>
        <GradientStop  Offset="1.5"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="Nic-PodstawowySzary" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Offset="-0.5"/>
        <GradientStop Color="{StaticResource ResourceKey=PodstawowySzaryKolor}" Offset="0.75"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="PodstawowySzary-Nic" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Color="{StaticResource ResourceKey=PodstawowySzaryKolor}" Offset="2"/>
        <GradientStop Offset="0"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="Bialy-Nic" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Color="White" Offset="0"/>
        <GradientStop Offset="0.5"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="CiemnyPrzezroczysty" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Color="#08FFFFFF" Offset="0"/>
        <GradientStop Color="#88000000" Offset="1"/>
    </LinearGradientBrush>
</ResourceDictionary>
 
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Button}" x:Key="GlassButton">
        <Setter Property="FontSize" Value="16" />
        <Setter Property="Foreground" Value="{StaticResource ResourceKey=PodstawowyNiebieskiBrush}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="1.7*"/>
                        </Grid.RowDefinitions>
                        <Border Name="ObramowanieBorder" Grid.Row="0" Grid.RowSpan="2" CornerRadius="10,10,10,10">
                            <Path Name="SwiatloBorder" Grid.Row="0" />
                        </Border>
                        <ContentPresenter x:Name="ButtonContentPresenter"
                                VerticalAlignment="Center"  
                                Grid.RowSpan="2" 
                                HorizontalAlignment="Center"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">

                            <Setter TargetName="ObramowanieBorder" Property="Background" Value="{StaticResource ResourceKey=PodstawowyNiebieski-Nic}" />
                            <Setter TargetName="SwiatloBorder" Property="Data" Value="M 5,12 S 0,2 15,2 L 180,2 S 200,2 190,12" />
                            <Setter TargetName="SwiatloBorder" Property="Fill" Value="{StaticResource ResourceKey=Bialy-Nic}" />

                            <Setter Property="FontWeight" Value="Bold" />
                            <Setter Property="Foreground" Value="White" />

                            <Setter TargetName="ObramowanieBorder" Property="BorderThickness" Value="1,1,1,1" />
                            <Setter TargetName="ObramowanieBorder" Property="BorderBrush" Value="White" />
                            <Setter TargetName="ObramowanieBorder" Property="RenderTransformOrigin" Value="0.5,0.5" />

                            <Setter Property="Cursor" Value="Hand" />
                        </Trigger>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="ObramowanieBorder" Property="RenderTransform">
                                <Setter.Value>
                                    <TransformGroup>
                                        <ScaleTransform ScaleX="0.9" ScaleY="0.9"/>
                                    </TransformGroup>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

Pozdrawiam,
Zoritt

0

Ehh, bym ja wiedział jak tego użyć... Dzięki, muszę to jakoś ogarnąć, bo nowy jestem w WPF.

0

Dodaj sobie do projektu dwa Resource Dictionary np. do katalogu Themes.
Do jednego wklej sobie pierwszy kod i nazwij go Zasoby. A do drugiego drugi i nazwij GlassButton.
następnie dodaj do App:

<ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Themes/Zasoby.xaml"/>
                <ResourceDictionary Source="Themes/GlassButton.xaml"/>
            </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Button opierasz o styl który zdefiniowałeś w Resource Dictionary. Jak sobie go umieścisz na jakimś obrazku to fajnie przez niego widać tło ;-)

<Button Height="50" Width="200" Style="{StaticResource GlassButton}" Content="Cos tam" />
 

Chyba tyle. Powodzenia :-)

Pozdrawiam,
Zoritt

0

Jesteś wielki :]

Jeszcze jedno pytanie... Jak robię tak jak napisałeś wywala błąd. Nie powinno być tak, że to GlassButton korzysta z Zasobów, a główne okno korzysta z GlassButtona, który to korzysta właśnie z zasobów? Nie wywala błędu gdy skopiuję zasoby do jednego pliku z GlassButtonem.

Nie ważne już. Faktycznie jest tak jak mówię, wrzuciłem do glassButton'a odwołanie do zasobów... Dzięki jeszcze raz.

0

O tyle nie jest dobrym pomysłem umieszczenie zasobów w GlassButton, że mogą one być wykorzystane w innych częściach programu. Myślę, że problemem może być brak <Application.Resources> w App.

Pozdrawiam,
Zoritt

1 użytkowników online, w tym zalogowanych: 0, gości: 1