Jump to content

desenhar picturebox em windows phone


Recommended Posts

Posted

boas

Quero desenhar um tabuleiro de xadrez em windows phone.

já o fiz para windows form, mas agora não estou a conseguir porque as Images do windows phone não tem as mesmas propriedades.

aqui esta o codigo para windows form

for (int i = 0; i < 8; i++)
            {
                tabuleiro[i] = new PictureBox[8];
            }

            int lx = 0, ly = 0;
            for (int x = 0; x < 8; x++)
            {
                lx = 0;
                for (int y = 0; y < 8; y++)
                {
                    tabuleiro[x][y] = new PictureBox();
                    tabuleiro[x][y].Location = new Point(ly, lx);
                    tabuleiro[x][y].Size = new System.Drawing.Size(50, 50);
                    tabuleiro[x][y].SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
                    tabuleiro[x][y].Tag = new Point(x, y);
                    tabuleiro[x][y].Name = "t" + x + "," + y;
                    tabuleiro[x][y].Click += new EventHandler(tabuleiro_click);
                    if (QueroMatriz(x, y) == 0)
                        tabuleiro[x][y].Image = Properties.Resources._0;
                    if (QueroMatriz(x, y) == -1)
                        tabuleiro[x][y].Image = Properties.Resources._1;
                    if (QueroMatriz(x, y) == 1)
                        tabuleiro[x][y].Image = Properties.Resources.Peca1;
                    if (QueroMatriz(x, y) == 2)
                        tabuleiro[x][y].Image = Properties.Resources.Peca2;
                    Controls.Add(tabuleiro[x][y]);
                    this.pbTabuleiro.Controls.Add(tabuleiro[x][y]);
                    lx += 50;
                }
                ly += 50;
            }

alquem me pode ajudar?

Posted

No sistema do Windows Phone, que é baseado em WPF e Silverlight, existe um sistem diferente para posicionamente dependendo do container que estiver sendo utilizado. Por exemplo, se o seu container for um Grid, você pode acertar o posicionamento usando Grid.Row, Grid.Column, se for Canvas, que é o mais próximo do Windows Form, você pode utilizar Canvas.SetLeft e Canvas.SetRight, outra opcao é utilizar margin, mas isto dever ser deixado para ajustes finos.

links:

http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-2-using-layout-management.aspx

http://www.silverlight.net/learn/creating-ui/layout,-rendering,-and-panels/layout-on-the-screen-%28silverlight-quickstart%29

Além do posicionamento existe alguma outra propriedade que você está tendo dificuldades?

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

petvetbr obrigado pela resposta

mas continuo a não entender como mexer no canvas. não estou a conseguir entrar nessa propriedade, eu altero isso no ficheiro cs que estou a trabalhar ou no xaml?

entretanto fui procurar e encontrei umas coisas que podem ate fazer o que quero:

for (int x = 0; x < 8; x++)
            {
                lx = 0;
                for (int y = 0; y < 8; y++)
                {
                    tabuleiro[x][y] = new Image();
                    tabuleiro[x][y].Margin = new Thickness(lx, ly, 0, 0);
                    tabuleiro[x][y].Width = 10;
                    tabuleiro[x][y].Height = 10;
                    tabuleiro[x][y].Tag = new Point(x, y);
                    tabuleiro[x][y].Name = "t" + x + "," + y;

                    if (matriz[x][y] == 0)
                        tabuleiro[x][y].Source = new BitmapImage(new Uri("/imgs/0.jpg", UriKind.Relative));



                    lx += 10;
                }
                ly += 10;
            }

estou a tentar fazer alguma coisa parecida com isto: http://www.windowsphonegeek.com/tips/wp7-working-with-images-content-vs-resource-build-action

mas nao me reconhece BitmapImage.

tenho que adicionar alguma coisa no xaml para poder usar as imagens?

outro problema é como adiciono o evento click a cada uma das imagens?

ainda estou muito verdinho no windows phone.  😕 mas vou la chegar 😉

Posted

No xaml

<Canvas Name="cv" width=[largura] height=altura/>

no cs

Ao criar cada image:

Canvas.SetLeft(image, [valor coordenada x]);

Canvas.SetTop(image, [valor coordenada y]);

cv.Children.Add(image);

-------

Quanto ao evento click - usar evento MouseDown já que imagens não tem click no xaml

------

Em relação as imagens- qual a BuildAction delas no projeto?

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

obrigado

mas para eu fazer isto:

tabuleiro[x][y].Source = new BitmapImage(new Uri("/imgs/0.jpg", UriKind.Relative));

tenho que mudar alguma coisa no xaml? não entendi essa parte.

Em relação as imagens- qual a BuildAction delas no projeto?

nao entendi

Posted

Não precisa mudar o código desde que o build action das imagens esteja correto. Você precisa clicar nas imagens que adicionou no projeto e ver se o build action delas (esta opção aparece na janela de propriedades do item) esta de acordo com o que foi recomendado no site que você mencionou na mensagem anterior.

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

hum entendi. bastante diferente para windows form!

resolvi da seguinte forma:

adicionei  a class System.Windows.Media.Imaging

mudei a buildaction para content

e deixou de dar erro aqui

tabuleiro[x][y].Source = new BitmapImage(new Uri("/imgs/0.jpg", UriKind.Relative));

só que agora não sei como usar isto:

Controls.Add(tabuleiro[x][y]);
this.pbTabuleiro.Controls.Add(tabuleiro[x][y]);

isto não e possível no WP

Posted

muito obrigado!

o que eu quero é exactamente isto:

for (int x = 0; x < 8; x++)
            {
                lx = 0;
                for (int y = 0; y < 8; y++)
                {
                    casa = new Image();

                    if (matriz[x][y] == 0)
                        casa.Source = new BitmapImage(new Uri("/imgs/0.jpg", UriKind.Relative));
                    if (matriz[x][y] == -1)
                        casa.Source = new BitmapImage(new Uri("/imgs/-1.jpg", UriKind.Relative));
                    if (matriz[x][y] == 1)
                        casa.Source = new BitmapImage(new Uri("/imgs/Peca1.jpg", UriKind.Relative));
                    if (matriz[x][y] == 2)
                        casa.Source = new BitmapImage(new Uri("/imgs/Peca2.jpg", UriKind.Relative));

                    Canvas.SetLeft(casa, ly);
                    Canvas.SetTop(casa, lx);
                    tabuleiro.Children.Add(casa);

                    lx += 50;
                }
                ly += 50;
            }

não estava a entender muito bem o que era o canvas, mas assim é muito mais fácil

só mais uma coisa, para o evento click, não devia ser qualquer coisa como:

Canvas.MouseLeftButtonDownEvent += new EventHandler(tabuleiro_MouseLeftButtonDown);

???

e depois dentro do evento eu quero alguma coisa isto:

tabuleiro = (Canvas)sender;
            Point p = new Point(Canvas.GetTop(tabuleiro) / 50, Canvas.GetLeft(tabuleiro) / 50);
...

não estou a encontrar exemplos com isto

Posted

Um jeito mais fácil é aplicar um valor na propriedade Tag de cada image e capturar o evento mousedown na image. Ai vc simplesmente pega o tag do Sender para identificar qual image foi pressionada.

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

sim eu sei.

mas o problema é ao adicionar o evento a imagem

Canvas.MouseLeftButtonDownEvent += new EventHandler(tabuleiro_MouseLeftButtonDown);
Posted

Isto não funciona?

...

casa = new Image();
  casa.MouseLeftButtonDownEvent += new EventHandler(tabuleiro_MouseLeftButtonDown); //pega o evento da imagem
if (matriz[x][y] == 0)
casa.Source = new BitmapImage(new Uri("/imgs/0.jpg", UriKind.Relative));

...

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

nao, da este erro:

Error 1 No overload for 'tabuleiro_MouseLeftButtonDown' matches delegate 'System.EventHandler'

ja tentei por casa.mousebuttonleftdown e canvas... e da o mesmo erro

Posted

Você tem um método exatamente como este no seu código?

private void tabuleiro_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//codigo aqui
}

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

onde está:

Canvas.MouseLeftButtonDownEvent += new EventHandler(tabuleiro_MouseLeftButtonDown);

troque por

 casa.MouseLeftButtonDown += new MouseButtonEventHandler(tabuleiro_MouseLeftButtonDown);

Fernando Lage Bastos - MCP/MCTS/MCPD

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.