WPF の使用を検討することをお勧めします。
WPFを使用すると、ListBoxItemにFileInfo.Nameプロパティのみを表示するように指示する独自のDataTemplateを作成できますが、「背後」には必要なFullPathプロパティが設定されており、すぐに使用できます...
さらに、SelectedItem を定義できるため、GUI での選択が完了するとすぐに、必要なオブジェクトが「自動的に」インスタンス化されます。そのため、多くのコーディング作業を行わなくてもダブルクリックを実装できます。
ここでのサンプル実装(申し訳ありませんが、すばやく、汚く、醜い...しかし...)は、必要に応じて機能します。
XAML (CAVE: ListBox.ItemTemplate で、ListBoxItem の DataTemplate として TextBlock にプロパティ名を表示すること、および選択した要素がメイン ウィンドウのプロパティにバインドされていることを伝えています):
<Window x:Class="ListBoxFiles.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">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ListBox ItemsSource="{Binding FileList, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"
SelectedItem="{Binding CurrentFile, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"
MouseDoubleClick="ListBox_MouseDoubleClick">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Click="Button_Click" Content="browse" Grid.Row="1" Width="50" Height="30"/>
</Grid>
</Window>
C# (CAVE: INotifyPropertyChanged を使用して、FileInfos のリストと CurrentFile をプロパティとして定義し、ダブルクリック イベントを処理します)。複数選択 FileOpenDialog を表示するシンプルなボタンを追加して、リストを埋めることができるようにしました...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using Microsoft.Win32;
using System.IO;
using System.Diagnostics;
namespace ListBoxFiles
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnNotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private List<FileInfo> _fileList;
public List<FileInfo> FileList
{
get
{
return _fileList;
}
set
{
_fileList = value;
OnNotifyPropertyChanged("FileList");
}
}
private FileInfo _currentFile;
public FileInfo CurrentFile
{
get
{
return _currentFile;
}
set
{
_currentFile = value;
OnNotifyPropertyChanged("CurrentFile");
}
}
public MainWindow()
{
InitializeComponent();
}
private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
//ListBox caller = (ListBox)sender;
//FileInfo fi = (FileInfo)caller.SelectedItem;
//Process.Start(fi.FullName);
Process.Start(this.CurrentFile.FullName);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "All files (*.*)|*.*";
ofd.Multiselect = true;
bool dialogResult = (bool)ofd.ShowDialog();
if (dialogResult)
{
this._fileList = new List<FileInfo>();
FileInfo fi;
foreach (string filename in ofd.FileNames)
{
fi = new FileInfo(filename);
this._fileList.Add(fi);
}
OnNotifyPropertyChanged("FileList");
}
}
}
}