C# UWP将孩子移动到其他家长问题

C# UWP将孩子移动到其他家长问题,c#,xaml,uwp,parent-child,uwp-xaml,C#,Xaml,Uwp,Parent Child,Uwp Xaml,首先,我是UWP的新手,我已经在几乎所有地方(使用Google和Stackoverflow)搜索过答案,但找不到我问题的答案 因此,问题是: 我计划使用Visual Studio 2017和Target Sdk:Creators Update为UWP创建一个像素绘制应用程序,该应用程序具有Edge(利用标题栏)等选项卡功能 当应用程序处于全屏状态时,我想将我制作的自定义标题栏移动到内容视图 我想从这里开始(windows标题栏,这只是按钮XAML代码,我不包括选项卡栏XAML代码,因为这是一个商

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

因此,问题是:

我计划使用Visual Studio 2017和Target Sdk:Creators Update为UWP创建一个像素绘制应用程序,该应用程序具有Edge(利用标题栏)等选项卡功能

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

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

下面是我的实用程序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.我是印尼人,所以我的句子可能有问题,希望你明白我在说什么。

你的代码片段有问题。例如,
RemoveChild
方法有两个参数,但在调用它时只提供一个参数。如果不指定
parentAsPanel
变量类型,则无法获取
Children
属性

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

XAML


我的测试环境是OS build 15063。如果您仍然有问题,请提供最小的项目。你可以试着在我的测试演示中重现这个问题。更多详细信息请参考。

抱歉,这是我的错误,我发布的上述代码实际上正在工作(只是一些错误复制的代码,例如实用程序代码上的参数是不必要的)

false在其父级上,我忘记在第二位(btnPlace2)父级上添加行定义

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

以下是em的一些图片:

在全屏模式下:

感谢所有回答并投票支持这个问题的人

致以最良好的祝愿


andr33ww

谢谢你的帮助,我明白了,我上面写的一些代码是错误的,但我在项目中的实际代码正在工作,所以这不是因为上面的任何参数或其他原因。我刚刚找到了罪魁祸首,这不是因为我在这里发布的任何代码,罪魁祸首实际上在我的btnplace2的父级上,我忘记放置行定义,所以下面的内容与上面的选项卡栏内容重叠。感谢您回答tho:)
<Grid x:Name="btnMenuPlace2" Grid.Column="0">
</Grid>
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
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;
}
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;
    }
}
<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";
           }
       }
   }
}