Dragonturtle
Dragonturtle

Reputation: 304

How to reach and-, name own FrameworkElement from xaml

I have the following, working code:

<Window x:Class="GemTowerDefense.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:GemTowerDefense"
    mc:Ignorable="d"
    Title="Gem Tower Defense" Height="670" Width="800"
    Loaded="Window_Loaded">
<Window.Resources>
    <local:GameControl x:Key="MyGameControl"/>
</Window.Resources>
 <Grid>
    <Border Background="Gray" Height="600" Width="600" Margin="3,26,189,3">
        <local:GameControl/>
    </Border>
 </Grid>
</Window>

Here you can see that I have the "local:GameControl" duplicated. This is because I only had the GameControl inside the "Grid" and the "Border". Everything worked fine, I implemented OnRender inside GameControl, it draws out everything I want it to.

My problem is, that I want this local:GameControl to interact with the MainWindow's buttons:

    <Button Click="Life_Button_Click" Content="Buy 1 Life" HorizontalAlignment="Left" Margin="608,26,0,0" VerticalAlignment="Top" Width="170"/>
    <Button Click="Upgrade_Button_Click" Content="Upgrade Chances" HorizontalAlignment="Left" Margin="608,51,0,0" VerticalAlignment="Top" Width="170"/>
    <Button Click="Place_Button_Click" Content="Place Gems" HorizontalAlignment="Left" Margin="608,156,0,0" VerticalAlignment="Top" Width="170"/>

So I added this inside "Grid". But inside the Button Click Event Handlers, I don't know how to reach GameControl.

What I want to do is something like this:

public partial class MainWindow : Window
{ 
    GameControl control { get; set; }
    private void Life_Button_Click(object sender, RoutedEventArgs e)
    {
        control.BuyLife();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        control = Application.Current.MainWindow.Resources["MyGameControl"] as GameControl;
    }
}

How can I achieve this to work?

This doesn't work obviously, because I cannot name GameControl with an x:Key, only if I add it as a resource, but then I dont know how to refer to it as a FrameworkElement in the xaml code.

Upvotes: 0

Views: 35

Answers (1)

mm8
mm8

Reputation: 169200

Give the control an x:Name:

<Border Background="Gray" Height="600" Width="600" Margin="3,26,189,3">
    <local:GameControl x:Name="control" />
</Border>

You can then access it in the code-behind:

private void Life_Button_Click(object sender, RoutedEventArgs e)
{
    control.BuyLife();
}

Upvotes: 1

Related Questions