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.
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
Ehh, bym ja wiedział jak tego użyć... Dzięki, muszę to jakoś ogarnąć, bo nowy jestem w WPF.
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
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.
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