Folder Picker FolderPicker Xmarin Forms Проводник
//Disclaimer: The creator of 'C# Shell (C# Offline Compiler)' is in no way responsible for the content posted by any user.
using System;
using System.IO;
using Xamarin.Forms;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.ComponentModel;
namespace MyProject
{
	public partial class FolderPicker : ContentPage
	{
		public ObservableCollection<Folder> folders { get; set; }
		//public IEnumerable<string> directories = Directory.EnumerateDirectories("//");
		public IEnumerable<string> directories;
		public string androidFolder = Android.OS.Environment.ExternalStorageDirectory.ToString();
		//public string selectedFolder { get; set; }
		public PathLabel pathLabel = new PathLabel();
		public Button backButton = new Button();
		public FolderPicker()
		{
			//selectedFolder = FolderPicker.androidFolder;
			folders = new ObservableCollection<Folder>();
			selectFolder();
			Label l = new Label();
			l.Margin = new Thickness(10, 0, 0, 0);
			l.BindingContext = pathLabel;
			l.SetBinding(Label.TextProperty, "SelectedFolder");
			Button addButton = new Button
			{
				HorizontalOptions = LayoutOptions.End,
				//VerticalOptions = LayoutOptions.StartAndExpand,
				Text = "+",
				BorderRadius = 30,
				BorderWidth = 2,
				WidthRequest = 50,
				HeightRequest = 50,
				Scale = 0.8,
				//Padding=new Thickness(0,10,0,10),
			};
			addButton.Clicked += createFolder;
			backButton = new Button
			{
				HorizontalOptions = LayoutOptions.Start,
				//VerticalOptions = LayoutOptions.StartAndExpand,
				Text = "ᐊ",
				BorderRadius = 30,
				BorderWidth = 2,
				WidthRequest = 50,
				HeightRequest = 50,
				Scale = 0.8,
				IsVisible = false,
				//Padding=new Thickness(0,10,0,10),
			};
			backButton.Clicked += async (sender, e) =>
			{
				selectFolder("", true);
			};
			Content = new StackLayout
			{
				Children ={
					l,
					new Grid{
							//Orientation= StackOrientation.Horizontal,
							//Padding=new Thickness(0,0,15,0),
							HeightRequest=64,
							Margin=new Thickness(15,0,15,-15),
							Children ={
								backButton,
								addButton
							}
						},
						createListView(),
						new StackLayout{
							HorizontalOptions =LayoutOptions.End,
							Orientation= StackOrientation.Horizontal,
							Children ={
								new Button{
									HorizontalOptions =LayoutOptions.End,
									Text="Выбрать"
								}
							}
						}
					}
			};
		}
		private void selectFolder(string folder = "", bool back = false)
		{
			folders.Clear();
			if (!back)
			{
				pathLabel.SelectedFolder = Path.Combine(pathLabel.SelectedFolder, folder);
			}
			else
			{
				pathLabel.SelectedFolder = Path.GetDirectoryName(pathLabel.SelectedFolder);
			}
			directories = Directory.GetDirectories(pathLabel.SelectedFolder);
			if (pathLabel.SelectedFolder != androidFolder)
			{
				backButton.IsVisible = true;
				//folders.Add(new Folder(".."));
			}
			else
			{
				backButton.IsVisible = false;
			}
			if (directories != null)
			{
				foreach (var directory in directories)
				{
					folders.Add(new Folder(Path.GetFileName(directory)));
				}
			}
		}
		private ListView createListView()
		{
			ListView listView = new ListView
			{
				//HasUnevenRows = true,
				// Определяем источник данных
				ItemsSource = folders,
				// Определяем формат отображения данных
				ItemTemplate = new DataTemplate(() =>
				{
					Label folderName = new Label()
					{
						TextColor = Color.Gray,
						VerticalOptions = LayoutOptions.Center,
						//Text = "1"
					};
					var renameAction = new MenuItem { Text = "Переименовать" };
					renameAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("name"));
					renameAction.Clicked += async (sender, e) =>
					{
						var mi = ((MenuItem)sender);
						string selectedTxt = (string)mi.CommandParameter;
						//pathLabel
						string newName = await DisplayPromptAsync("Новый проет", "Введите название:", "ОК", "Отмена", selectedTxt);
						if (newName == null)
						{
							newName = "";
						}
						if (newName.Length > 0)
						{
							string sourceDirectory = Path.Combine(pathLabel.SelectedFolder, selectedTxt);
							string destinationDirectory = Path.Combine(pathLabel.SelectedFolder, newName);
							try
							{
								Directory.Move(sourceDirectory, destinationDirectory);
								selectFolder();
								Toast.Show("Папка переименован");
							}
							catch (Exception er)
							{
								Toast.Show("Ошибка " + er.Message);
							}
						}
						else
						{
							Toast.Show("Отмена");
						}
					};
					var deleteAction = new MenuItem { Text = "Удалить", IsDestructive = true }; // red background
					deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("name"));                                                                                               //deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("."));
					deleteAction.Clicked += async (sender, e) =>
					{
						var mi = ((MenuItem)sender);
						string selectedTxt = (string)mi.CommandParameter;
						//pathLabel
						bool answer = await DisplayAlert("Удаление", "Вы уверены, что хотите удалить папку " + selectedTxt, "Да", "Нет");
						if(answer){
						try
						{
							Directory.Delete(Path.Combine(pathLabel.SelectedFolder, selectedTxt));
							selectFolder();
							Toast.Show("Папка удалена");
						}
						catch (Exception er)
						{
							Toast.Show("Ошибка " + er.Message);
						}}
						else{
							Toast.Show("Отмена");
						}
					};
					// add to the ViewCell's ContextActions property
					folderName.SetBinding(Label.TextProperty, "name");
					//folderName.Text
					// создаем объект ViewCell.
					var viewCell = new ViewCell
					{
						View = folderName
					};
					viewCell.ContextActions.Add(renameAction);
					viewCell.ContextActions.Add(deleteAction);
					viewCell.Tapped += folder_Tapped;
					return viewCell;
				})
			};
			/*listView.ItemSelected+= (sender, e)=>{
						Toast.Show("ggg");
					};*/
			listView.SelectionMode = ListViewSelectionMode.None;
			listView.Margin = 10;
			//
			//
			return listView;
		}
		private void folder_Tapped(object sender, System.EventArgs e)
		{
			var viewCell = (ViewCell)sender;
			Label l = (Label)viewCell.View;
			string folderName = l.Text;
			selectFolder(folderName);
			//Toast.Show(l.Text);
		}
		public class Folder
		{
			public string name { get; set; }
			public Folder(string name)
			{
				this.name = name;
			}
		}
		public class PathLabel : INotifyPropertyChanged
		{
			private string selectedFolder;
			public string SelectedFolder
			{
				get
				{
					return selectedFolder;
				}
				set
				{
					selectedFolder = value;
					OnPropertyChanged(nameof(SelectedFolder));
				}
			}
			public PathLabel()
			{
				// some initialization code here ...
				SelectedFolder = Android.OS.Environment.ExternalStorageDirectory.ToString();
			}
			public event PropertyChangedEventHandler PropertyChanged;
			protected virtual void OnPropertyChanged(string propertyName)
			{
				PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
			}
		}
		private async void createFolder(object sender, EventArgs args)
		{
			string folderName = await DisplayPromptAsync("Новая папка", "Введите название:");
			if (folderName != null)
			{
				Directory.CreateDirectory(Path.Combine(pathLabel.SelectedFolder, folderName));
				folders.Insert(0, new Folder(folderName));
			}
		}
	}
}
Комментарии
Отправить комментарий