Я унаследовал класс 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» ...
Однако это особыйCenario, в котором я хочу предотвратить это поведение, потому что я представляю свойства класса визуально, и когда я изменяю значение любого свойства в сетке свойств, он изменяет файл ярлыка, и я считаю, что это слишком много ненужных операций записи, чтобыфайл ярлыка ...
Вместо этого я позволю конечному пользователю иметь возможность изменять любые значения в пользовательском интерфейсе, не перезаписывая файл ярлыка постоянно, и просто использовать вид «Сохранить».кнопку, чтобы применить изменения, внесенные в файл ярлыка, когда он будет готов.
Мой вопрос: в 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
, файл ярлыка повторно-written.Как и ожидалось.