Рейтинг@Mail.ru
aave

aave

Print Friendly, PDF & Email

Чтобы создать копию экземпляра класса в приложении .NET, его нельзя просто присвоить значению другого объекта. Как известно, классы в .NET относятся к ссылочному типу, и при присваивании объекта другому объекту, будет присвоена только ссылка на исходный объект. А при попытке изменить какое-то из полей или свойств вновь созданного объекта, изменится соответствующее поле или свойство исходного объекта. Поэтому, как вариант, можно поступить так (код на VB.NET):

Public Shared Function GetCopy(ByVal myOriginalObject As MyObject) As MyObject

  'Получаем список публичных свойств экземпляра типа MyObject:'
  Dim props() As PropertyInfo = myOriginalObject.GetType.GetProperties(BindingFlags.Public Or BindingFlags.Instance)
  Dim myObjectCopy As New MyObject
 
  'Копируем значения всех свойств, доступных для записи:'
  For Each pi As PropertyInfo In props
    If pi.CanWrite Then
      Dim value As Object = pi.GetValue(myOriginalObject, Nothing)
        pi.SetValue(myObjectCopy, value, Nothing)
      End If
    Next
 
    Return myObjectCopy
 
End Function

Можно воспользоваться и таким решением:

Dim newObj as Object = obj.MemberwiseClone()

Нужно учесть, что этот метод MemberwiseClone() копирует объект не полностью. Члены значимого типы копируются, а ссылочного – нет, копируется только ссылка.

Print Friendly, PDF & Email
Читать далее...
Print Friendly, PDF & Email

Зачастую нужно чтобы текст переносился на следующую строку, занимая всю ширину родительского элемента. За это отвечает свойство TextWrapping.Распространённые случаи:

<ListView HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">

Элементы ListViewItem при этом должны быть типа TextBlock, а горизонтальная полоса прокрутки HorizontalScrollBar отключена.

Или другой случай:

<GroupBox.Header>
  <TextBlock TextWrapping="Wrap" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type GroupBox}}, Path=ActualWidth}" />
</GroupBox.Header>

Вместо GroupBox.Header может быть любой контейнер. Важно, что ширина устанавливается с помощью привязки к актуальной ширине ActualWidth родителя.

Print Friendly, PDF & Email
Читать далее...
Print Friendly, PDF & Email

Чтобы получить объект Window определённого типа, можно перебрать все активные окна приложения:

For Each wnd As Window In Application.Current.Windows
    If wnd.GetType.Equals(GetType(MyParentWindow)) Then
        parentWindow = CType(wnd, MyParentWindow)
        Exit For
    End If
Next
Print Friendly, PDF & Email
Читать далее...
Print Friendly, PDF & Email

Чтобы использовать собственный пользовательский элемент управления UserControl в качестве шаблона элемента ListViewItem или ListBoxItem, нужно следующее:

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <local:MyUserControl />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Здесь local – это пространство имён вашей сборки. Например: <xmlns:local="clr-namespace:MyApplication" />>.

При этом в MyUserControl не следует задавать контекст данных DataContext.

Print Friendly, PDF & Email
Читать далее...
Subscribe to this RSS feed