OpenFileDialog в Avalonia - ошибка с ShowAsync - PullRequest
0 голосов
/ 12 июня 2019

Справочная информация:

Я использую Avalonia для разработки кроссплатформенного пользовательского интерфейса. Чтобы узнать это, я пытаюсь создать простую программу, которая открывает файл .txt с помощью OpenFileDialog и отображает его содержимое в ComboBox в другом окне.

Я пытаюсь написать метод, который открывает диалог с файлом и возвращает путь, который открыл пользователь. Я использую кнопку с событием Click, чтобы открыть диалоговое окно файла и поместить указанный путь в TextBox для просмотра пользователем. Поскольку я новичок как в WPF, так и в Авалонии, я не уверен, что делать дальше.

Проблема:

Я создал представление пользовательского интерфейса и модель представления. Модель представления использует INotifyPropertyChanged для отображения выбранного пути к файлу в TextBox, который я по умолчанию установил для диска C.

Теперь я хочу использовать OpenFileDialog для обновления этого пути путем к файлу .txt, выбранному пользователем. Я нашел пример, который демонстрирует OpenFileDialog, но, похоже, он не работает для меня, и я не совсем понимаю, как он должен работать.

TxtView.xaml:

<TextBox Text="{Binding Path}" Margin="0 0 5 0" Grid.Column="0" IsReadOnly="True" />
<Button Content="Browse" Click="OnBrowseClicked" Margin="0 0 0 0" Grid.Column="1" />

TxtView.xaml.cs:

public async Task GetPath()
{
   var dialog = new OpenFileDialog();
   dialog.Filters.Add(new FileDialogFilter() { Name = "Text", Extensions = { "txt" } });
   dialog.AllowMultiple = true;

   var result = await dialog.ShowAsync();

   if (result != null)
   {
      await GetPath(result);
   }
}

public void OnBrowseClicked(object sender, RoutedEventArgs args)
{
   var context = this.DataContext as TxtViewModel;
   context.Path = "path";
}

TxtViewModel.cs

class TxtViewModel : INotifyPropertyChanged
{
   private string _path;

   public string Path
   {
      get => _path;
      set
      {
         if (value != _path)
         {
            _path = value;
            OnPropertyChanged();
         }
      }
   }  

   public event PropertyChangedEventHandler PropertyChanged;

   protected virtual void OnPropertyChanged([CallerMemberName] string 
   propertyName = null)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }

}

Ошибка, которую я получаю с этим кодом, связана с ShowAsync () в файле TxtView.xaml.cs. В сообщении об ошибке говорится: «Не задан аргумент, который соответствует обязательному формальному параметру« parent »в OpenFileDialog.ShowAsync (Window)».

Я пробовал ShowAsync (это), который исправляет ошибку с ShowAsync, но теперь выдает ошибку «Аргумент 1: невозможно преобразовать из« Txt2List.Views.TxtView »в« Avalonia.Controls.Window »

Мы ценим любую помощь, и я прошу прощения, если мне не ясно, я совершенно новичок в Avalonia, WPF и XAML, поэтому я учусь. Пожалуйста, дайте мне знать, если есть дополнительная информация, которую я могу предоставить.

1 Ответ

0 голосов
/ 12 июня 2019

dialog.ShowAsync(); имеет параметр Window parent, который в настоящее время является обязательным.Возможно, вы используете устаревшую версию Avalonia (0.7), где она не была указана в сигнатуре метода.

Окно для сопоставленного элемента управления можно получить, вызвав (Window)control.GetVisualRoot()

...