【问题标题】:UWP Moving Childs to Other Parent ProblemsUWP 将孩子转移到其他家长问题
【发布时间】:2017-09-18 05:55:28
【问题描述】:

首先,我是 UWP 的新手,我已经在几乎所有地方(使用 Google 和 Stackoverflow)搜索了答案,但找不到我的问题的答案。

那么,问题来了:

我计划使用 Visual Studio 2017 和 Target Sdk: Creators Update 为 UWP 创建一个具有标签功能的像素绘画应用程序,例如 Edge(利用标题栏)。

当应用处于全屏状态时,我想将我制作的自定义标题栏移动到内容视图。

我想从这里移开(windows 标题栏,这只是按钮 XAML 代码,我不包括标签栏 XAML 代码,因为它是一个商业项目):

<Grid x:Name="btnMenuPlace1" Grid.Column="0">
    <Grid x:Name="btnMenuPlaceContent" Background="{StaticResource SystemControlHighlightListAccentMediumBrush}">
    <Button x:Name="btnMenu" FontFamily="Segoe MDL2 Assets" Content="&#xE700;"
Width="50" Height="50" Background="Transparent" Click="btnMenu_Click"/>
    </Grid>
</Grid>

到这里(用户视图):

<Grid x:Name="btnMenuPlace2" Grid.Column="0">
</Grid>

这些 Grid 的两个父级都是另一个使用 Grid.ColumnDefinitions 的 Grid,如下所示:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

这是我的 C# 代码:

private void WindowSizeChanged(object sender, WindowSizeChangedEventArgs e)
{
    var appView = ApplicationView.GetForCurrentView();
    if (appView.IsFullScreenMode)
    {
        Utility.RemoveChild(btnMenuPlaceContent);
        btnMenuPlace2.Children.Add(btnMenuPlaceContent);
        Utility.RemoveChild(tabBarPlaceContent);
        tabBarPlace2.Children.Add(tabBarPlaceContent);
    }
    else
    {
        Utility.RemoveChild(btnMenuPlaceContent);
        btnMenuPlace1.Children.Add(btnMenuPlaceContent);
        Utility.RemoveChild(tabBarPlaceContent);
        tabBarPlace1.Children.Add(tabBarPlaceContent);
    }
    e.Handled = true;
}

这是我的实用程序 RemoveChild 代码:

public static void RemoveChild(DependencyObject parent, UIElement child)
{
    var parentAsPanel = VisualTreeHelper.GetParent(child);
    if (parentAsPanel != null)
    {
        parentAsPanel.Children.Remove(child);
        return;
    }
    var parentAsContentPresenter = parent as ContentPresenter;
    if (parentAsContentPresenter != null)
    {
        if (parentAsContentPresenter.Content == child)
        {
            parentAsContentPresenter.Content = null;
        }
        return;
    }
    var parentAsContentControl = parent as ContentControl;
    if (parentAsContentControl != null)
    {
        if (parentAsContentControl.Content == child)
        {
            parentAsContentControl.Content = null;
        }
        return;
    }
}

这是我的应用进入全屏模式前的样子:

所以问题是每当应用程序进入全屏模式时,孩子确实会移动到新的父级,但按钮不存在,只有网格的背景颜色剩余,我无法点击其中任何一个(不是单击事件工作),看看:

当我切换回非全屏视图时,新选项卡上的进度条加载未显示。 我不知道我做错了 XAML 还是 C# 代码。

任何帮助将不胜感激。

P.S.我是印尼人,所以可能我的句子有问题,希望你明白我在说什么。

【问题讨论】:

    标签: c# xaml uwp parent-child uwp-xaml


    【解决方案1】:

    您的代码 sn-p 有问题。例如,RemoveChild 方法有两个参数,但您在调用它时只提供一个。如果不分配 parentAsPanel 变量类型,您将无法获得 Children 属性。

    由于代码未完成,在更新代码并添加一些其他需要的代码后,我可以正确运行您的代码 sn-p 并且无法重现上述问题。这是我完成的测试代码:

    XAML

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <StackPanel>
            <Grid x:Name="btnMenuPlace1" Grid.Column="0" Grid.Row="0">
                <Grid x:Name="btnMenuPlaceContent" Background="{StaticResource SystemControlHighlightListAccentMediumBrush}">
                    <StackPanel Orientation="Horizontal">
                        <Button x:Name="btnMenu" FontFamily="Segoe MDL2 Assets" Content="&#xE700;" Width="50" Height="50" Background="Transparent"  />
                        <!--<local:CustomTitleBar Width="200" Height="50"></local:CustomTitleBar>-->
                    </StackPanel>
                </Grid>
            </Grid>
            <Grid x:Name="btnMenuPlace2" Grid.Column="1" Grid.Row="1"/>
            <TextBlock Text="text" x:Name="txtresult"></TextBlock>
            <Button x:Name="ToggleFullScreenModeButton" Margin="0,10,0,0" Click="ToggleFullScreenModeButton_Click">
                <SymbolIcon x:Name="ToggleFullScreenModeSymbol" Symbol="FullScreen" />
            </Button>
        </StackPanel> 
    </Grid>
    

    后面的代码

    public sealed partial class MainPage : Page
    {
       public MainPage()
       {
           this.InitializeComponent();
           CoreApplication.GetCurrentView().TitleBar.ExtendViewIntoTitleBar = true;
           Window.Current.SetTitleBar(btnMenuPlace1);
           Window.Current.SizeChanged += Current_SizeChanged;
       }
    
       private void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
       {
           var appView = ApplicationView.GetForCurrentView();
           if (appView.IsFullScreenMode)
           { 
               RemoveChild(btnMenuPlace1, btnMenuPlaceContent);
               btnMenuPlace2.Children.Add(btnMenuPlaceContent);            
           }
           else
           {
               RemoveChild(btnMenuPlace2, btnMenuPlaceContent);             
               btnMenuPlace1.Children.Add(btnMenuPlaceContent);
           }
           e.Handled = true;
       }
    
       public void RemoveChild(DependencyObject parent, UIElement child)
       {
           Grid parentAsPanel = VisualTreeHelper.GetParent(child) as Grid;
           if (parentAsPanel != null)
           {                
               parentAsPanel.Children.Remove(child);
               return;
           }
           var parentAsContentPresenter = parent as ContentPresenter;
           if (parentAsContentPresenter != null)
           {
               if (parentAsContentPresenter.Content == child)
               {
                   parentAsContentPresenter.Content = null;
               }
               return;
           }
           var parentAsContentControl = parent as ContentControl;
           if (parentAsContentControl != null)
           {
               if (parentAsContentControl.Content == child)
               {
                   parentAsContentControl.Content = null;
               }
               return;
           }
       }     
    
       private void ToggleFullScreenModeButton_Click(object sender, RoutedEventArgs e)
       {
           var view = ApplicationView.GetForCurrentView();
           if (view.IsFullScreenMode)
           {
               view.ExitFullScreenMode();                
           }
           else
           {
               if (view.TryEnterFullScreenMode())
               {
                   txtresult.Text = "full screen";
               }
               else
               {
                   txtresult.Text = "no full screen";
               }
           }
       }
    }
    

    我的测试环境是 OS build 15063。如果您仍然有问题,请提供 minimal 复制项目。您可以尝试在我的测试演示中重现该问题。更多详情请参考official sample

    【讨论】:

    • 感谢您的帮助,我明白了,我上面写的一些代码是错误的,但我的项目中的实际代码正在运行,所以这不是因为任何参数或上面的东西。我实际上只是找到了罪魁祸首,这不是因为我在这里发布的任何代码,罪魁祸首实际上是在我的 btnplace2 的父级上,我忘记放置行定义,所以下面的内容与上面的选项卡栏内容重叠。谢谢你的回答:)
    【解决方案2】:

    对不起,这是我的错误,我发布的上述代码实际上是有效的(只是一些错误复制的代码,例如实用程序代码上的参数不是必需的)。

    false 在它的父级上,我忘了在第二个位置 (btnPlace2) 父级上添加行定义。

    现在它可以工作了,现在看起来很棒:)

    这是他们的一些照片:

    在全屏模式下:

    感谢任何回答并投票赞成这个问题的人。

    最好的问候,

    andr33ww

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多