我继承了 FileSystemInfo 类,以实现名为 ShortcutFileInfo 的类,该类将表示快捷方式(.lnk)文件。
我通过属性网格(Windows Forms项目)表示该类,
现在,因为我的实现就像 FileInfo 对象的普通实例一样工作,这意味着在设置了任何属性后,设置器会修改文件内容,例如在设置此属性时属性来更改文件属性:
<Description("The file attributes of the current shortcut file.")>
<DisplayName("Attributes")>
<Category("File Info Extended")>
Public Shadows Property Attributes As FileAttributes
Get
Return MyBase.Attributes
End Get
Set(value As FileAttributes)
If (value <> MyBase.Attributes) Then
MyBase.Attributes = value
End If
End Set
End Property
或通过另一个属性来设置快捷方式描述:
<Description("The shortcut description.")>
<DisplayName("Description")>
<Category("Shortcut")>
Public Property Description As String
Get
Return Me.description_
End Get
Set(value As String)
If (value <> Me.description_) Then
Me.description_ = value
Me.WriteLink()
End If
End Set
End Property
Private description_ As String
(请注意对Me.WriteLink()
方法的调用,该方法将对快捷方式文件的修改写入。)
这是我实现的行为,因为这是我期望的,它与使用常规FileInfo / DirectoryInfo类时的行为相同,而不是实现一种“ SaveFile”方法...
但是,这是一种特殊的情况,在这种情况下,我想避免这种行为,因为我是在视觉上表示类属性,并且当我修改属性网格中任何属性的值时,它都会修改快捷方式文件,并且我认为对快捷方式文件进行了太多不必要的写操作...
相反,我将让最终用户能够在用户界面中更改任何值,而无需不断重新编写快捷方式文件,而只需使用一种“保存”按钮将对快捷方式所做的更改应用到他准备好后归档。
我的问题是:在C#或VB.NET中,这将是一种好方法,而无需修改我的 ShortcutFileInfo 类的实现? (属性设置器)。我的意思是,如何让最终用户在不触发已加载对象的属性设置器的情况下编辑属性网格中的任何属性?或者其他一些方法来防止在属性网格中的属性值是改变了。
也许可以通过PropertyGrid.PropertyValueChanged
事件来完成某些工作,但是我不确定是什么,以及如何做。
我能想到的唯一且最平庸的解决方案是,当我要在属性网格中加载 ShortcutFileInfo 对象时,请创建该对象的副本,并指向系统的临时目录,然后将该对象加载到PropertyGrid中。这样,原始快捷方式文件将不会被修改,但是在系统临时目录中创建的临时快捷方式文件将被修改,因此这确实不能解决主要问题。
如果有助于更好地理解它,这是我创建快捷方式文件并将其加载到属性网格中的作用:
Dim lnk As New ShortcutFileInfo("C:\Test Shortcut.lnk")
lnk.Create()
' Deletes FileAttributes.ReadOnly attribute from file, like FileInfo class does.
lnk.IsReadOnly = False
With lnk
.Attributes = FileAttributes.System
.Description = "My shortcut file description"
.Hotkey = Keys.Shift Or Keys.Alt Or Keys.Control Or Keys.F1
.Icon = "Shell32.dll"
.IconIndex = 0
.Target = "C:\Target.exe"
.TargetArguments = "/arg1 /arg2"
.WindowState = ShortcutWindowState.Normal
.WorkingDirectory = Path.GetDirectoryName(lnk.Target)
End With
' Adds FileAttributes.ReadOnly attribute to file, like FileInfo class does.
lnk.IsReadOnly = True
Me.PropertyGrid1.SelectedObject = lnk
请注意,设置了lnk
对象的任何属性后,快捷方式文件将被重写。符合预期。