Могу ли я удалить ChildWindow из VisualTree и вставить его обратно для достижения FullScreen? - PullRequest
1 голос
/ 16 августа 2011

У меня есть всплывающее окно ChildWindow. Внутри этого всплывающего окна у меня есть UserControl (MediaPreviewView), который имеет MediaElement и несколько кнопок для управления видео. В моих требованиях указано, что мне нужна полноэкранная кнопка, и когда пользователь нажимает на кнопку, отображается полноэкранное видео.

Я использую MVVM, поэтому я решил попробовать это с Messaging в MVVM Light. Я отправляю сообщение в мою базу View. В коде этого представления я показываю сетку (скрытую и внизу XAML, с высоким zindex). Мое сообщение содержит MediaPreviewControl, и я устанавливаю Grid.Children.Add (для элемента управления. Я пробовал несколько вещей и могу сделать ChildWindow невидимым, но кнопки не работают. Кажется, что ChildWindow все еще находится над кнопками, хотя ширина и высота были 0. Есть ли лучше работоспособного подхода к созданию полноэкранного режима моего MediaPreviewView?

public class MediaPreviewFullScreenMessage
{
    public MediaPreviewView PreviewView { get; set; }
    public ChildWindow ContainerChildWindow { get; set; }
    public bool ChangeToFullScreen { get; set; }
}

// Register for FullScreen media preview
Messenger.Default.Register<MediaPreviewFullScreenMessage>(this,
(fullScreenMessage) =>
{
  this.fullScreenHolderGrid.Visibility = fullScreenMessage.ChangeToFullScreen ? Visibility.Visible : Visibility.Collapsed;
  this.fullScreenHolderGrid.Children.Clear();
  if (fullScreenMessage.ChangeToFullScreen)
  {
// I've tried, Visibility, width and height = 0 on the fullScreenMessage.ContainerChildWindow, even a TranslateTransform
....
}
});

1 Ответ

0 голосов
/ 22 ноября 2011

Как насчет просто максимизировать ChildWindow? За вашим полным экраном Button вы делаете,

    private void FullScreenButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        // get the explorer window size
        double height = App.Current.Host.Content.ActualHeight;
        double width = App.Current.Host.Content.ActualWidth;

        // need to make it a little bit smaller or it won't resize
        this.Height = height - 1;
        this.Width = width - 1;

        // need to update the layout here
        this.UpdateLayout();

        // the following code repositions the child window
        var root = VisualTreeHelper.GetChild(this, 0) as FrameworkElement;
        if (root == null)
        {
            return;
        }

        var contentRoot = root.FindName("ContentRoot") as FrameworkElement;
        if (contentRoot == null)
        {
            return;
        }

        var group = contentRoot.RenderTransform as TransformGroup;
        if (group == null)
        {
            return;
        }

        TranslateTransform translateTransform = null;
        foreach (var transform in group.Children.OfType<TranslateTransform>())
        {
            translateTransform = transform;
        }

        if (translateTransform == null)
        {
            return;
        }

        // reset transform
        translateTransform.X = 0.0;
        translateTransform.Y = 0.0;
    }

UPDATE

В стиле по умолчанию ChildWindow он имеет Grid, называемый ContentRoot, который устанавливает положение ChildWindow на RenderTransform. Вот почему вам нужно сбросить TranslateX и TranslateY, чтобы сделать его верхним левым.

                        <Grid x:Name="ContentRoot" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Height="{TemplateBinding Height}" RenderTransformOrigin="0.5,0.5" VerticalAlignment="{TemplateBinding VerticalAlignment}" Width="{TemplateBinding Width}">
                            <Grid.RenderTransform>
                                <TransformGroup>
                                    <ScaleTransform/>
                                    <SkewTransform/>
                                    <RotateTransform/>
                                    <TranslateTransform/>
                                </TransformGroup>
                            </Grid.RenderTransform>
...