1

我有一个弹出窗口,它是一个 ChildWindow。在该弹出窗口中,我有一个 UserControl (MediaPreviewView),它有一个 MediaElement 和一些用于控制视频的按钮。我的要求是我需要一个全屏按钮,并在用户单击该按钮时全屏显示视频。

我正在使用 MVVM,所以我决定尝试使用 MVVM Light 中的消息传递。我正在向我的基本视图发送一条消息。在该视图的代码隐藏中,我显示了一个网格(隐藏在 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
....
}
});
4

1 回答 1

0

只是简单地最大化怎么样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;
    }

更新

ChildWindow的默认样式中,它有 thisGrid调用ContentRoot来设置ChildWindowby的位置RenderTransform。这就是为什么您需要重置TranslateXTranslateY使其位于左上方的原因。

                        <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>
于 2011-11-22T06:02:48.133 回答