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));
}
}
}
}
Комментарии
Отправить комментарий