【发布时间】:2018-09-06 07:40:14
【问题描述】:
使用 Visual Studio 2017 社区 15.8.1
这是在查看了有关 ActivityIndicator 的 stackoverflow 的所有选项之后。因此,尽管这可能是重复的,但没有什么能帮助我。 所以最终决定发布我的锻炼并从这里获得最好的帮助。
我到目前为止所尝试的:-
1. {Binding IsLoading} + INotifyPropertyChanged + public void RaisePropertyChanged(string propName) + IsLoading = true;概念。
2. ActivityIndicator_Busy.IsVisible = false; (直接控制访问)
这两种方法大多被推荐,我在过去几周里深入研究了每一种方法。但没有任何问题。
我取得了什么成就?:-
ActivityIndicator_Busy.IsVisible = false;只有当我在执行语句之前返回时,概念才能顺利运行(用于测试目的); Button Clicked 事件的声明。 (附图)
但是,一旦我删除了退货;按下按钮后,在暂停一段时间后,主页会立即打开。
我的问题:-
1. 这对于当前场景来说是特别的,当用户点击欢迎按钮时,如何让 ActivityIndicator 立即运行。
2. 同样,当应用程序启动时,还有一个空白的白屏,持续几秒钟,几乎 30 秒,我也想显示 ActivityIndicator。但不知道如何在哪个实例上强加该逻辑。
我的意见
我的 MainPage.xaml 文件:- (编辑于 2018 年 9 月 6 日晚上 9 点 11 分)
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Name="page_main_page"
NavigationPage.HasBackButton="False"
NavigationPage.HasNavigationBar="False"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:appNutri"
BindingContext="{x:Reference page_main_page}"
x:Class="appNutri.MainPage">
<ContentPage.Content>
<StackLayout BackgroundColor="White"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<StackLayout>
<Image x:Name="Image_Welcome"
Source="welcome.png"
HorizontalOptions="CenterAndExpand"
VerticalOptions="CenterAndExpand"
WidthRequest="300"
HeightRequest="300" />
<Button x:Name="Button_Welcome"
Clicked="Button_Welcome_Clicked"
Text="Welcome!"
BackgroundColor="DeepSkyBlue"
HorizontalOptions="CenterAndExpand"
VerticalOptions="CenterAndExpand"
TextColor="White"
HeightRequest="60" />
</StackLayout>
<StackLayout BackgroundColor="White"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<ActivityIndicator
x:Name="ActivityIndicator_Busy"
Color="Black"
IsEnabled="True"
HorizontalOptions="Center"
VerticalOptions="Center"
IsRunning="{Binding Source={x:Reference page_main_page}, Path=IsLoading}"
IsVisible="{Binding Source={x:Reference page_main_page}, Path=IsLoading}" />
</StackLayout>
</StackLayout>
</ContentPage.Content>
</ContentPage>
我的 MainPage.cs 代码:-
(于 2018 年 9 月 6 日晚上 9 点 13 分编辑)
using appNutri.Model;
using SQLite;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace appNutri
{
public partial class MainPage : Xamarin.Forms.ContentPage, INotifyPropertyChanged
{
private bool isLoading;
public bool IsLoading
{
get
{
return isLoading;
}
set
{
isLoading = value;
RaisePropertyChanged("IsLoading");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
public MainPage()
{
InitializeComponent();
BindingContext = this;
}
protected override void OnAppearing()
{
base.OnAppearing();
BindingContext = this;
}
protected async void Button_Welcome_Clicked(object sender, EventArgs e)
{
IsLoading = true;
await Select_Local_User_Information();
IsLoading = false;
}
private async Task Select_Local_User_Information()
{
IsLoading = true;
string where_clause = "";
try
{
Sql_Common.Database_Folder_Path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
string Database_Full_Path = Path.Combine(Sql_Common.Database_Folder_Path, Sql_Common.Database_Name);
SQLiteConnection connection = new SQLiteConnection(Database_Full_Path);
//connection.DropTable<User_Master>();
//connection.Delete(connection.Table<User_Master>());
//connection.CreateTable<User_Master>(CreateFlags.ImplicitPK | CreateFlags.AutoIncPK);
connection.CreateTable<User_Master>();
int count = connection.ExecuteScalar<int>("Select count(*) from User_Master");
if (count == 0)
{
connection.DropTable<User_Master>();
connection.CreateTable<User_Master>();
//IsLoading = false;
//IsBusy = false;
await Navigation.PushAsync(new User_Register_Page());
}
else
{
Sql_Common.User_Logged = true;
var Local_User_Data = connection.Table<User_Master>().ToList();
User_Master.Logged_User_Details_Container.First_Name = Local_User_Data[0].First_Name;
User_Master.Logged_User_Details_Container.Cell1 = Local_User_Data[0].Cell1;
where_clause = " Upper ( First_Name ) = " + "'" + User_Master.Logged_User_Details_Container.First_Name.ToUpper().Trim() + "'" + " and " +
" Cell1 = " + "'" + User_Master.Logged_User_Details_Container.Cell1.Trim() + "'";
int records = Sql_Common.Get_Number_Of_Rows_Count("User_Master", where_clause);
if (records == 0)
{
connection.DropTable<User_Master>();
connection.CreateTable<User_Master>();
IsLoading = false;
await Navigation.PushAsync(new User_Register_Page());
}
else
{
User_Master.User_Master_Table(where_clause, User_Master.Logged_User_Details_Container);
IsLoading = false;
await Navigation.PushAsync(new User_Home_Page());
}
}
connection.Close();
}
catch (SQLiteException ex)
{
string ex_msg = ex.Message;
}
IsLoading = false;
}
}
}
2018 年 10 月 4 日
终于用This Answer解决了
【问题讨论】:
-
您能否将您的代码剥离为minimal reproducible example?如果没有其他任何东西,解决问题会更容易。
-
附带说明: 您正在手动连接您的 SQL 语句。这是 SQLite,如果用户想要 xe 无论如何都可以访问数据,但如果你在未来某个地方访问了真正的 My-MS-、PostgreSQL 数据库,这将为 SQLi 攻击打开大门。
-
New Query 刚刚提出您的担忧,也是一位用户之前的建议之一。对于相同的更详细的问题和任何解决方案将不胜感激。我想要一个单独的讨论,因此这里不再回复了
-
另一边注:如果您在
RaisePropertyChanged中使用CallerMemberName属性,则不必写出属性的名称,但它会自动确定由编译器。 -
请看看我的更新对你有没有帮助。
标签: xamarin.forms visual-studio-2017