当我尝试在Visual Studio上运行应用程序时,我遇到了一个例外。我正在尝试使用xamarin表单构建时间表,当有人单击相关性(“ Prioridade”的4个选项)时,它将时间表作为新事件保存。每当我尝试在仿真中尝试新的事情时,都会遇到相同的错误。下面是代码:
XAML
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
xmlns ="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XPerfilEMenu.Tarefas.Cadastro">
<ContentPage.Content>
<StackLayout Margin="40" Spacing="40">
<Label FontAttributes="Bold" Text="Nome da tarefa" />
<Entry x:Name="TarefaDigitada"/>
<Label FontAttributes="Bold" Text="Prioridade da tarefa" />
<StackLayout x:Name="SLPrioridades" Spacing="30">
<!--URGENTE E IMPORTANTE-->
<StackLayout Spacing="10" Orientation="Horizontal">
<!--<Image Source="4.png"/>-->
<Image>
<Image.Source>
<OnPlatform
x:TypeArguments="FileImageSource">
<On
Platform="iOS, Android"
Value="Vermelho.png" />
</OnPlatform>
</Image.Source>
</Image>
<Label
Text="Urgente e importante"
TextColor="Gray"
HorizontalOptions="FillAndExpand" />
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Tapped="PrioridadeEscolhida" />
</StackLayout.GestureRecognizers>
</StackLayout>
<!--URGENTE E NÃO IMPORTANTE-->
<StackLayout
Spacing="10"
Orientation="Horizontal">
<Image
Source="Laranja.png" />
<Label
Text="Urgente e não importante"
HorizontalOptions="FillAndExpand"
TextColor="Gray" />
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Tapped="PrioridadeEscolhida" />
</StackLayout.GestureRecognizers>
</StackLayout>
<!--NÃO URGENTE E IMPORTANTE-->
<StackLayout
Spacing="10"
Orientation="Horizontal">
<Image
Source="Amarelo.png" />
<Label
Text="Não urgente e importante"
HorizontalOptions="FillAndExpand"
TextColor="Gray" />
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Tapped="PrioridadeEscolhida" />
</StackLayout.GestureRecognizers>
</StackLayout>
<!--NÃO URGENTE E NÃO IMPORTANTE-->
<StackLayout
Spacing="10"
Orientation="Horizontal">
<Image
Source="Verde.png" />
<Label
Text="Não urgente e não importante"
HorizontalOptions="FillAndExpand"
TextColor="Gray" />
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Tapped="PrioridadeEscolhida" />
</StackLayout.GestureRecognizers>
</StackLayout>
<!-- ADICIONAR BOTÃO -->
<Button HorizontalOptions="End" Margin="20" Clicked="AdicionarTarefa">
<Button.ImageSource>
<OnPlatform
x:TypeArguments="FileImageSource">
<On
Platform="iOS, Android"
Value="AddBotao.png" />
</OnPlatform>
</Button.ImageSource>
</Button>
</StackLayout>
</StackLayout>
</ContentPage.Content>
</ContentPage>
C#,我遇到的大多数问题
using System;
using Xamarin.Forms;
using XPerfilEMenu.Tarefas;
namespace XPerfilEMenu.Tarefas
{
public partial class Cadastro : ContentPage
{
private string Prioridade { get; set; }
public byte PrioridadeFinal { get; set; }
public Cadastro()
{
InitializeComponent();
}
public void PrioridadeEscolhida(object sender, EventArgs args)
{
//Primeiro localiza todas labels com base no slprioridades e vamos fazer com que todas forcem para cor cinza e depois faz apenas o elemento clicado fique escuro
var Stacks = SLPrioridades.Children;
foreach(var Linha in Stacks)
{
Label LabelPrioridade = ((StackLayout)Linha).Children[1] as Label;
LabelPrioridade.TextColor = Color.Gray;
}
//Agora vamos transformar o que foi clicado em preto
((Label)((StackLayout)sender).Children[1]).TextColor = Color.Black;
//Capturando qual foi a prioridade clicada com base no nome da imagem.
FileImageSource Source = ((Image)((StackLayout)sender).Children[0]).Source as FileImageSource;
//Para obter o nome do elemento clicado, se usa:
Prioridade = Source.File.ToString().Replace(".png", "");
}
//Salvando novo evento
public void AdicionarTarefa(object sender, EventArgs args)
{
bool ErroExiste = false;
//Verificando se os dois campos estão preenchidos. Para strings, verificando se o tamanho é maior que 0:
if (!(TarefaDigitada.Text.Trim().Length > 0))
{
ErroExiste = true;
DisplayAlert("Erro", "Tarefa não digitada", "Okay");
}
//Já, para a prioridade,
if (!(Prioridade.Trim().Length > 0))
{
ErroExiste = true;
DisplayAlert("Erro", "Prioridade não escolhida", "Okay");
}
//Se o bool ErroExiste chegar até o final como falsa, a tarefa será salva.
if (ErroExiste == false)
{
PostsAFazer postsAFazer = new PostsAFazer();
postsAFazer.Nome = TarefaDigitada.Text.Trim();
postsAFazer.Prioridade = byte.Parse(Prioridade);
new GerenciadorPostagens().Salvar(postsAFazer);
//Para confirmar, fazemos o campo de digitar a tarefa para mostrar quantos elementos temos na lista
TarefaDigitada.Text = new GerenciadorPostagens().Listagem().Count.ToString();
}
}
}
}
为什么要遍历布局,这很繁琐且容易出错。
您可以使用属性:x:Name
:例如:
<Label
x:Name="LabelPrioridade"
Text="Urgente e não importante"
HorizontalOptions="FillAndExpand"
TextColor="Gray" />
并且使用起来很简单:
LabelPrioridade.TextColor = Color.Gray;