Wed, April 16, 2008, 02:38 AM under
Silverlight
From a Silverlight 2 app we can prompt the user with a safe OpenFileDialog (OFD) so they can choose a file from their file system that we can then use in our application. It is interesting to contrast it with the existing OFD types that we have in the full framework. We have
one for Windows Forms (in
System.Windows.Forms namespace in same named assembly) and
one for WPF (in
Microsoft.Win32 namespace in
PresentationFramework.dll assembly):
In the diagram above, I have filtered out many methods and properties so if you are interested in those please visit the hyperlinks I embedded above. Also, on a totally separate note, you may be interested in the
new features that the WinForms dialog was enhanced with in Fx 2.0 SP1.
The Silverlight variant does not have any of the rich features (e.g. setting the title, readonly configuration, advanced extension usage, checking for file/path existence, setting initial directory, validation, showing help etc). It also does not have any parent classes (other than
Object), so all required methods are defined on the
OpenFileDialog class itself (which resides in the
System.Windows.Controls namespace in the
System.Windows.dll assembly). Below is the complete list of its members PLUS a new type (
FileDialogFileInfo) that is introduced specifically for Silverlight:
The
Filter and
FilterIndex properties work just like the desktop counterparts (as do the obvious
ctor and
Dispose method).
EnableMultipleSelection is also obvious, but it is worth noting the departure from the name used in the other two variants:
Multiselect. Also obvious is the
ShowDialog method but without following the link can you tell what the return type is? Up to this point you couldn't really tell if the SL dev team borrowed the design from the WPF team or from the WinForms team. Note that the WPF variant of
ShowDialog returns a
nullable Boolean (an interesting choice). The WinForms variant of
ShowDialog returns the same type that the Silverlight variant returns: a
DialogResult enumeration!
OK, enough of the obvious, let's move on to the not so obvious and see where the new type
FileDialogInfo comes into play. The answer comes when we examine the return type of the
SelectedFile property and find that it returns a
FileDialogFileInfo object (and correspondingly the
SelectedFiles returns a collection of
FileDialogFileInfo objects). So, for security reasons, we are not given a path to the file that the user selected, and instead we are given an object from which we can discover the
Name of the file and can open it as a stream (
OpenRead or
OpenText). Sample code:
var ofd = new OpenFileDialog();
ofd.EnableMultipleSelection = false;
ofd.Filter = "Txt Files|*.txt|Silverlight Video Files|*.wmv";
ofd.FilterIndex = 2;
if (ofd.ShowDialog() != DialogResult.OK)
return;
FileDialogFileInfo fdi = ofd.SelectedFile;
lbl.Text = fdi.Name; // lbl is a TextBlock
if (ofd.FilterIndex == 1) //not robust but hey..
{
StreamReader sr = fdi.OpenText();
txt.Text = sr.ReadToEnd(); // txt is a TextBox
sr.Close();
}
else if (ofd.FilterIndex == 2) //not robust but hey..
{
wmv.SetSource(fdi.OpenRead()); // wmv is a MediaElement
}
See it
running in action here (plus a bit more). Get the source via the usual
decompiling method.