7.4. Az Image
Az Image használata lehet egyszerű, de bonyolult is, attól függően, hogy mit szeretnénk megvalósítani a program futása során. Képet több módon is elhelyezhetünk az ablakba, vagy akár gomb, esetleg más vezérlőelem háttereként. Ha gomb hátterébe helyezzük el, akkor a Solution Explorer részben célszerű egy (pl.: image) könyvtárt létrehozni és az abban elhelyezett képeket erőforrásként hozzáadni a programhoz, így a kép megjelenik a gomb hátterében, de ha az egeret fölé visszük, akkor sajnos a kép eltűnik. Ez kezdő programozóknak problémát jelent, mivel az alapbeállítást kell megváltoztatni a gomb viselkedését illetően, ami nem egyszerű feladat.
Nézzünk most egy egyszerű, de közismert játék megvalósítását WPF-ben.
65. feladat
Készítsünk alkalmazást, amellyel a kő, papír, olló játékot lehet játszani a számítógép ellen! Tegyük fel, hogy többen is szeretik ezt a játékot egy családban és mindig annak a képe jelenik meg, aki éppen játszik. Az egyszerűség kedvéért legyen két felhasználó, de természetesen a program könnyen bővíthető, több felhasználó is használhatja a programot. A képek alatti gombra kattintva eltűnik az éppen nem játszó felhasználók képe és megjelennek a játékhoz szükséges vezérlőelemek. Ehhez az alábbi elrendezést célszerű kialakítani. Név: WPF4
Megoldás:
A XAML rész:
<Window x:Name="window1" x:Class="WPF4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPF4"
mc:Ignorable="d"
Title="Kő Papír Olló" Height="800" Width="1200"
MaxWidth="1200" MaxHeight="800" MinWidth="1200" MinHeight="800">
<Grid>
<Button x:Name="mano1Button" Content="Manó1" HorizontalAlignment="Left" Margin="259,367,0,0" VerticalAlignment="Top" Width="100" Click="Button_Click" RenderTransformOrigin="2.565,3.979" Height="30" FontSize="16"/>
<Button x:Name="mano2Button" Content="Manó2" HorizontalAlignment="Left" Margin="516,367,0,0" VerticalAlignment="Top" Width="100" Click="mano2Button_Click" RenderTransformOrigin="1.344,2.844" Height="30" FontSize="16"/>
<Image x:Name="mano1" HorizontalAlignment="Center" Margin="79,67,654,388" Source="mano1.jpg" Stretch="Fill" MinWidth="192" MinHeight="192" VerticalAlignment="Center" MaxWidth="192" MaxHeight="192" ScrollViewer.VerticalScrollBarVisibility="Auto" StretchDirection="DownOnly" ScrollViewer.HorizontalScrollBarVisibility="Auto">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform/>
<RotateTransform Angle="0"/>
<TranslateTransform />
</TransformGroup>
</Image.RenderTransform>
</Image>
<Image x:Name="mano2" Margin="355,67,439,375" Source="mano2.jpg" Stretch="Fill" HorizontalAlignment="Center" MaxWidth="124" MaxHeight="205" VerticalAlignment="Center" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" MinWidth="124" MinHeight="205"/>
<Label x:Name="jatek" Content="Játék" HorizontalAlignment="Left" Margin="844,174,0,0" VerticalAlignment="Top" FontSize="20" RenderTransformOrigin="2.253,2.589"/>
<Label x:Name="gep" Content=" " HorizontalAlignment="Left" Margin="823,250,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.028,0.194" Background="#FFFlE6CD" FontSize="20"/>
<Button x:Name="buttonKo" Content="Kő" HorizontalAlignment="Left" Margin="663,333,0,0" VerticalAlignment="Top" Width="75" FontSize="20" Click="buttonKo_Click" RenderTransformOrigin="2.155,3.428"/>
<Button x:Name="buttonPapir" Content="Papír" HorizontalAlignment="Left" Margin="823,333,0,0" VerticalAlignment="Top" Width="75" FontSize="20" Click="buttonPapir_Click"/>
<Button x:Name="buttonOllo" Content="Olló" HorizontalAlignment="Left" Margin="984,333,0,0" VerticalAlignment="Top" Width="75" FontSize="20" Click="buttonOllo_Click"/>
<Button x:Name="ok" Content="OK" HorizontalAlignment="Left" Margin="823,406,0,0" VerticalAlignment="Top" Width="75" FontWeight="Bold" FontSize="20" Click="ok_Click"/>
<Label x:Name="gepPontLabel" Content="Gép pontszáma: " HorizontalAlignment="Left" Margin="335,462,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="22"/>
<Label x:Name="jatekosPontLabel" Content="Játékos pontszáma:" HorizontalAlignment="Left" Margin="299,536,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="22"/>
<Label x:Name="gepPont" Content="0" HorizontalAlignment="Left" Margin="582,462,0,0" VerticalAlignment="Top" FontSize="22"/>
<Label x:Name="jatekosPont" Content="0" HorizontalAlignment="Left" Margin="582,536,0,0" VerticalAlignment="Top" FontSize="22"/>
<Button x:Name="ujJatek" Content="Új játék" HorizontalAlignment="Left" Margin="605,628,0,0" VerticalAlignment="Top" Width="125" FontFamily="Yellowtail" Height="55" FontSize="36" Click="ujJatek_Click" />
</Grid>
</Window>
A felhasználókat Manó1 és Manó2 néven láthatjuk a fenti ábrán. Az átméretezhetőség megakadályozása érdekében a Properties részben az 1200x800-as méreteket ajánlott beállítani alapként és ugyanezeket az értékeket a maximális és minimális méretekhez is.
A program kódja:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WPF4
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
jatek.Visibility = Visibility.Hidden;
gep.Visibility = Visibility.Hidden;
buttonKo.Visibility = Visibility.Hidden;
buttonPapir.Visibility = Visibility.Hidden;
buttonOllo.Visibility = Visibility.Hidden;
ok.Visibility = Visibility.Hidden;
gepPontLabel.Visibility = Visibility.Hidden;
jatekosPontLabel.Visibility = Visibility.Hidden;
gepPont.Visibility = Visibility.Hidden;
jatekosPont.Visibility = Visibility.Hidden;
ujJatek.Visibility = Visibility.Hidden;
}
private bool ko = false, papir = false, ollo = false;
private int geppont = 0, emberpont = 0;
private void buttonKo_Click(object sender, RoutedEventArgs e)
{
ko = true;
papir = false;
ollo = false;
buttonKo.Background = Brushes.Red;
buttonKo.Content = "Kő";
buttonPapir.Background = Brushes.Gray;
buttonOllo.Background = Brushes.Gray;
}
private void buttonPapir_Click(object sender, RoutedEventArgs e)
{
papir = true;
ko = false;
ollo = false;
buttonPapir.Background = Brushes.Red;
buttonPapir.Content = "Papír";
buttonKo.Background = Brushes.Gray;
buttonOllo.Background = Brushes.Gray;
}
private void buttonOllo_Click(object sender, RoutedEventArgs e)
{
ollo = true;
ko = false;
papir = false;
buttonOllo.Background = Brushes.Red;
buttonOllo.Content = "Olló";
buttonKo.Background = Brushes.Gray;
buttonPapir.Background = Brushes.Gray;
}
private void ujJatek_Click(object sender, RoutedEventArgs e)
{
geppont = 0;
emberpont = 0;
gepPont.Content = Convert.ToString(geppont);
jatekosPont.Content = Convert.ToString(emberpont);
}
private void Button_Click(object sender, RoutedEventArgs e) // Manó 1 kiválasztása
{
mano2.Visibility = Visibility.Hidden;
mano2Button.Visibility = Visibility.Hidden;
jatek.Visibility = Visibility.Visible;
gep.Visibility = Visibility.Visible;
buttonKo.Visibility = Visibility.Visible;
buttonPapir.Visibility = Visibility.Visible;
buttonOllo.Visibility = Visibility.Visible;
ok.Visibility = Visibility.Visible;
gepPontLabel.Visibility = Visibility.Visible;
jatekosPontLabel.Visibility = Visibility.Visible;
gepPont.Visibility = Visibility.Visible;
jatekosPont.Visibility = Visibility.Visible;
ujJatek.Visibility = Visibility.Visible;
}
private void mano2Button_Click(object sender, RoutedEventArgs e) // Manó 2 kiválasztása
{
mano1.Visibility = Visibility.Hidden;
mano1Button.Visibility = Visibility.Hidden;
jatek.Visibility = Visibility.Visible;
gep.Visibility = Visibility.Visible;
buttonKo.Visibility = Visibility.Visible;
buttonPapir.Visibility = Visibility.Visible;
buttonOllo.Visibility = Visibility.Visible;
ok.Visibility = Visibility.Visible;
gepPontLabel.Visibility = Visibility.Visible;
jatekosPontLabel.Visibility = Visibility.Visible;
gepPont.Visibility = Visibility.Visible;
jatekosPont.Visibility = Visibility.Visible;
ujJatek.Visibility = Visibility.Visible;
}
private void ok_Click(object sender, RoutedEventArgs e)
{
Random vsz = new Random();
int szam = vsz.Next(3);
if (szam == 0)
{
gep.Content = "Kő";
if (papir == true) emberpont++;
if (ollo == true) geppont++;
}
if (szam == 1)
{
gep.Content = "Papír";
if (ko == true) geppont++;
if (ollo == true) emberpont++;
}
if (szam == 2)
{
gep.Content = "Olló";
if (papir == true) geppont++;
if (ko == true) emberpont++;
}
gepPont.Content = Convert.ToString(geppont);
jatekosPont.Content = Convert.ToString(emberpont);
}
}
}
A láthatóság alapból a leírtaknak megfelelően van beállítva, és a Manó1, vagy Manó2 gombra kattintva változik meg.
A program lényegi része a véletlenszerűen előállított szám segítségével valósul meg, amely 3 értéket vehet fel: * 0 - kő * 1 - papír * 2 - olló.
A játékos által kijelölt gomb és a gép által véletlenszerűen adott értékek eltérése a játék szabályainak megfelelően pontot ad a játékosnak, vagy a számítógépnek. Ha egyezik a két érték, akkor nem jár pont egyik félnek sem, mivel az if nem tartalmaz else részt sehol.
Megemlíthető még a buttonOllo.Background = Brushes.Red; kódrész, ahol a gomb hátterének változtatása látható a programon belül.
Látható, hogy néhány változó private-ként az alprogramokon kívül került elhelyezésre, mivel azokat több eseménynél is használni kell.
A képeket célszerű a programunk könyvtárában elhelyezni. A window részbe pedig egyszerűen másolás-beillesztés után a megfelelő méret beállításával fixen rögzíthetjük. Itt is ajánlott az alapértékek megtartása a maximális és minimális szélesség és magasság beállításánál.
