0

古いアプリの一部をWinフォームからWPFに移行しようとしています。私の古いwin-formアプリではListBox、以下のコードを使用して配列をに送信できます。

私の新しいWPFアプリでは、これはにデータを入力しませんListBox。奇妙なのは、エラーが発生せず、機能しないことです。

...アプリを初めてテストしたときにエラーが発生しましたが、権限がないというメッセージが表示されましたが、今では何もせずに「完了」というメッセージが表示されます。

private void btnFolderBrowser_Click(object sender, RoutedEventArgs e)
{
    getFileStructure();
    System.Windows.Forms.MessageBox.Show("done!");
}

private void getFileStructure()
{
    string myDir = "";
    int i;
    string filter = txtFilter.Text;

    FolderBrowserDialog fbd = new FolderBrowserDialog();
    fbd.RootFolder = Environment.SpecialFolder.Desktop;
    fbd.ShowNewFolderButton = false;
    fbd.Description = "Browse to the root directory where the files are stored.";

    if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        myDir = fbd.SelectedPath;

    try
    {
        txtRootDir.Text = fbd.SelectedPath;
        string[] fileName = Directory.GetFiles(myDir, filter, SearchOption.AllDirectories);

        for (i = 0; i < fileName.Length; i++)
            lstFileNames.Items.Add(fileName[i]);
    }

    catch (System.Exception excep)
    {
        System.Windows.Forms.MessageBox.Show(excep.Message);
        return;
    }
}
4

1 に答える 1

2

WPFでは、コードビハインドにプロパティを入力し、UI要素をそれらのプロパティにバインドする必要があります。コードビハインドからUIElementを参照/アクセスすることはお勧めできません。

これは、あなたがやろうとしていることに基づいたモックアップの例です。

Xaml:

<Window x:Class="WpfApplication14.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="350" Width="525" Name="UI">
    <StackPanel DataContext="{Binding ElementName=UI}">
        <TextBox Text="{Binding TextRootDir}" IsReadOnly="True" />
        <ListBox ItemsSource="{Binding MyFiles}" SelectedItem="{Binding SelectedFile}" Height="244" />
        <TextBox Text="{Binding TextFilter, UpdateSourceTrigger=PropertyChanged}" />
        <Button Content="Browse" Click="btnFolderBrowser_Click" >
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="IsEnabled" Value="True" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding TextFilter}" Value="">
                            <Setter Property="IsEnabled" Value="False" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </StackPanel>

</Window>

コード:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private string _textRootDir;
    private string _textFilter = string.Empty;
    private string _selectedFile;
    private ObservableCollection<string> _myFiles = new ObservableCollection<string>();

    public MainWindow()
    {
        InitializeComponent();
    }

    public ObservableCollection<string> MyFiles
    {
        get { return _myFiles; }
        set { _myFiles = value; }
    }

    public string SelectedFile
    {
        get { return _selectedFile; }
        set { _selectedFile = value; NotifyPropertyChanged("SelectedFile"); }
    }

    public string TextFilter
    {
        get { return _textFilter; }
        set { _textFilter = value; NotifyPropertyChanged("TextFilter"); }
    }

    public string TextRootDir
    {
        get { return _textRootDir; }
        set { _textRootDir = value; NotifyPropertyChanged("TextRootDir"); }
    }

    private void btnFolderBrowser_Click(object sender, RoutedEventArgs e)
    {
        GetFileStructure();
        MessageBox.Show("done!");
    }

    private void GetFileStructure()
    {
        string myDir = "";
        System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
        fbd.RootFolder = Environment.SpecialFolder.Desktop;
        fbd.ShowNewFolderButton = false;
        fbd.Description = "Browse to the root directory where the files are stored.";

        if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            myDir = fbd.SelectedPath;
            try
            {
                TextRootDir = fbd.SelectedPath;
                MyFiles.Clear();
                foreach (var file in Directory.GetFiles(myDir, TextFilter, SearchOption.AllDirectories))
                {
                    MyFiles.Add(file);
                }
            }
            catch (Exception excep)
            {
                MessageBox.Show(excep.Message);
                return;
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

結果:

ここに画像の説明を入力してください

于 2013-02-03T23:11:35.483 に答える