после ответа от @ sky-dev здесь я мог бы реализовать решение к проблеме воздушного пространства в WPF при работе с элементом управления WinFormsHost. Но я новичок в WPF, и теперь я пытаюсь понять его код, и я не понимаю, почему некоторые свойства зависимостей определены как присоединенные свойства, а затем их оболочки реализуются как для обычных свойств зависимостей.
Попробую лучше объяснить мою путаницу с кодом:
Сначала определяются свойства зависимости:
public class AirspacePopup : Popup
{
public static readonly DependencyProperty IsTopmostProperty =
DependencyProperty.Register("IsTopmost",
typeof(bool),
typeof(AirspacePopup),
new FrameworkPropertyMetadata(false, OnIsTopmostChanged));
public static readonly DependencyProperty FollowPlacementTargetProperty =
DependencyProperty.RegisterAttached("FollowPlacementTarget",
typeof(bool),
typeof(AirspacePopup),
new UIPropertyMetadata(false));
public static readonly DependencyProperty AllowOutsideScreenPlacementProperty =
DependencyProperty.RegisterAttached("AllowOutsideScreenPlacement",
typeof(bool),
typeof(AirspacePopup),
new UIPropertyMetadata(false));
public static readonly DependencyProperty ParentWindowProperty =
DependencyProperty.RegisterAttached("ParentWindow",
typeof(Window),
typeof(AirspacePopup),
new UIPropertyMetadata(null, ParentWindowPropertyChanged));
Как видите, первый DP определяется как обычный DP, поскольку он зарегистрирован с помощью метода DependencyProperty.Register (..), но остальные DP определены как Attached, поскольку они зарегистрированы с помощью DependencyProperty.RegisterAttached ( ..) метод.
Теперь обертки:
public bool IsTopmost
{
get { return (bool)GetValue(IsTopmostProperty); }
set { SetValue(IsTopmostProperty, value); }
}
public bool FollowPlacementTarget
{
get { return (bool)GetValue(FollowPlacementTargetProperty); }
set { SetValue(FollowPlacementTargetProperty, value); }
}
public bool AllowOutsideScreenPlacement
{
get { return (bool)GetValue(AllowOutsideScreenPlacementProperty); }
set { SetValue(AllowOutsideScreenPlacementProperty, value); }
}
public Window ParentWindow
{
get { return (Window)GetValue(ParentWindowProperty); }
set { SetValue(ParentWindowProperty, value); }
}
Все оболочки реализованы для обычного DP ... Насколько я знаю, если DP зарегистрирован как прикрепленный, оболочка должна быть примерно такой:
public static bool GetFollowPlacementTarget(UIElement element)
{
if (element == null)
{
throw new ArgumentNullException(...);
}
return (bool)element.GetValue(FollowPlacementTarget);
}
public static void SetFollowPlacementTarget(UIElement element, bool value)
{
if (element == null)
{
throw new ArgumentNullException(...);
}
element.SetValue(FollowPlacementTarget, value);
}
Итак, в чем может быть причина для регистрации свойства зависимости как присоединенного свойства, если у него нет оболочки для использования его как присоединенного свойства в XAML? Не мог бы кто-нибудь объяснить, почему этот код реализован именно так?
Спасибо.