Откройте TabItem в новом окне - PullRequest
       32

Откройте TabItem в новом окне

0 голосов
/ 11 февраля 2019

В моем приложении есть следующее присоединенное свойство для вызова ICommand при загрузке UserControl или Window:

public static readonly DependencyProperty LoadedCommandProperty = DependencyProperty.RegisterAttached(
    "LoadedCommand", typeof(ICommand), typeof(UserControlExtensions), new PropertyMetadata(null, OnLoadedCommandChanged));

private static void OnLoadedCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ContentControl userControl = d as ContentControl;
    if (userControl == null)
        return;

    if (e.NewValue is ICommand)
    {
        userControl.Loaded += UserControlOnLoaded;
    }
}

private static void UserControlOnLoaded(object sender, RoutedEventArgs e)
{
    ContentControl userControl = sender as ContentControl;
    if (userControl == null)
        return;

    ICommand command = GetLoadedCommand(userControl);
    command.Execute(GetLoadedCommandParameter(userControl));
}

public static void SetLoadedCommand(DependencyObject element, ICommand value)
{
    element.SetValue(LoadedCommandProperty, value);
}

public static ICommand GetLoadedCommand(DependencyObject element)
{
    return (ICommand) element.GetValue(LoadedCommandProperty);
}

public static readonly DependencyProperty LoadedCommandParameterProperty = DependencyProperty.RegisterAttached(
    "LoadedCommandParameter", typeof(object), typeof(UserControlExtensions), new PropertyMetadata(default(object)));

public static void SetLoadedCommandParameter(DependencyObject element, object value)
{
    element.SetValue(LoadedCommandParameterProperty, value);
}

public static object GetLoadedCommandParameter(DependencyObject element)
{
    return (object) element.GetValue(LoadedCommandParameterProperty);
}

Это просто отлично работает.В моих представлениях я называю это на UserControl как:

AttachedProperties:UserControlExtensions.LoadedCommand="{Binding ViewLoadedCommand}"

И будет вызываться ICommand в модели представления.

Теперь я реализовал функцию, с помощью которой я могу щелкнуть Button в заголовке TabItem и открыть содержимое этого TabItem в новом окне.(Например, открепление вкладки в Visual Studio.)

Для этого я использую следующий код:

private void OpenInWindowButtonOnClick(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    if (button == null)
        return;

    TabItem tabItem = button.Tag as TabItem;
    if (tabItem == null)
        return;

    string title = string.Empty;

    ContentControl headerContent = tabItem.Header as ContentControl;
    if (headerContent != null)
    {
        title = headerContent.Content.ToString();
    }

    string workspaceId = tabItem.Tag as string;

    TabItem workspaceTab = WorkspaceTab.Items.OfType<TabItem>()
        .FirstOrDefault(ti => ti.Tag is string && (string)ti.Tag == workspaceId);
    if (workspaceTab != null)
    {
        WorkspaceWindow workspaceWindow = new WorkspaceWindow(tabItem);
        workspaceWindow.Content = workspaceTab.Content;

        workspaceWindow.Width = (workspaceTab.Content as FrameworkElement).ActualWidth;
        workspaceWindow.Height = (workspaceTab.Content as FrameworkElement).ActualHeight;

        workspaceWindow.Title = title;
        workspaceWindow.Closing += WorkspaceWindowOnClosing;
        workspaceWindow.Show();
        workspaceWindows.Add(workspaceId, workspaceWindow);
        WorkspaceTab.Items.Remove(workspaceTab);
    }
}

Это также просто отлично работает.

Моя проблема сейчасесли я открою новую вкладку (в которой также есть TabControl, где TabItem s имеет свойстводенга-прикрепленное свойство) и переместлю эту вкладку в новое окно с кодом выше: загруженная команда не будет вызываться при переключениик представлению, в котором используется загруженное-прикрепленное свойство.

Если я отлаживаю прикрепленное свойство, я вижу, что OnLoadedCommandChanged вызывается правильно, но UserControlOnLoaded не вызывается.Если я не открою TabItem в новом окне, UserControlOnLoaded вызывается правильно.

Любые идеи, почему загруженное событие подстраниц не срабатывает, если я перевожу TabItem на новый Window?

1 Ответ

0 голосов
/ 12 февраля 2019

Проблема была в строке WorkspaceTab.Items.Remove(workspaceTab);

Эта строка удаляет TabItem из TabControl, и кажется, что wpf выполняет здесь какую-то очистку.

I 'мы решили проблему, просто установив Visibility из TabItem в Hidden.

...