我应该如何将多个控件添加到 WPF 窗口? [复制]

Posted

技术标签:

【中文标题】我应该如何将多个控件添加到 WPF 窗口? [复制]【英文标题】:How should I add multiple controls to a WPF window? [duplicate] 【发布时间】:2021-03-29 16:24:38 【问题描述】:

免责声明,我对 WPF 比较陌生。

目前,每当我在设计器上放置另一个控件时,所有其他控件都会从 XAML 代码中完全删除。因此,我完全无能为力。

我应该为每个控件制作一个单独的 XAML 文件吗?或者是不是有什么奇怪的事情发生了?

作为参考,这是我当前的 XAML 代码:

<Window x:Class="Lively.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Lively"
        mc:Ignorable="d"
        Title="Lively" Height="450" Width="662" Foreground="Black" AllowsTransparency="True" WindowStyle="None" ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen" Cursor="Arrow" MouseDown="DragWindow">
    <Window.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <LinearGradientBrush.RelativeTransform>
                <TransformGroup>
                    <ScaleTransform CenterY="0.5" CenterX="0.5" ScaleY="2"/>
                    <SkewTransform CenterY="0.5" CenterX="0.5"/>
                    <RotateTransform Angle="40.601" CenterY="0.5" CenterX="0.5"/>
                    <TranslateTransform/>
                </TransformGroup>
            </LinearGradientBrush.RelativeTransform>
            <GradientStop Color="Black" Offset="0.033"/>
            <GradientStop Color="#FF360606" Offset="1"/>
            <GradientStop Color="#FF0F0202"/>
            <GradientStop Color="#FF0D0101" Offset="0.248"/>
            <GradientStop Color="#FE170202"/>
            <GradientStop Color="#FF0B0101" Offset="0.211"/>
            <GradientStop Color="#FF080808" Offset="0.256"/>
            <GradientStop Color="#FF2E0606" Offset="1"/>
            <GradientStop Color="#FF0E0707" Offset="1"/>
            <GradientStop Color="#FF010000" Offset="0.274"/>
        </LinearGradientBrush>
    </Window.Background>
    <Window.OpacityMask>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="Black" Offset="0.207"/>
            <GradientStop Color="Black" Offset="0.007"/>
        </LinearGradientBrush>
    </Window.OpacityMask>
    <Image x:Name="Logo" Source="src/Assets/Core/Lively_32x32.png" HorizontalAlignment="Left" Height="39" Margin="619,10,0,0" VerticalAlignment="Top" Width="33" RenderTransformOrigin="0.467,0.5" Stretch="None" ToolTip="Just the logo :)"/>
</Window>

再举个例子,如果我在设计器上放置一个标签,整个&lt;Image&gt; 标记将被删除,就好像它从未存在过一样。

【问题讨论】:

【参考方案1】:

是的,Window 元素可以包含单个元素。但是您可以将其设置为像 Grid 这样的容器或任何其他可以将其他元素作为子元素的容器元素。在里面你可以添加任意数量的元素

<Window x:Class="GPRS_Simulator.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:GPRS_Simulator"
        mc:Ignorable="d"
        Title="GPRS SIMULATOR" Height="393" Width="708.5" Loaded="winloaded" ResizeMode="NoResize">
    <Grid>
        <Label .... your label parameters/>
        <ComboBox .... your comboBox parameters/>
        <Button .... your button parameters/>
        ... other elements
    </Grid>
</Window>

所以代替你的

&lt;Image x:Name="Logo" Source=.../&gt;

你应该使用像我在上面使用的 Grid 这样的容器元素来包含多个元素。

例如。

<Grid>
   <Image x:Name="Logo" Source=.../>
   <Button x:Name= ...../>
   <other elements you want to add ... ... />
</Grid>

【讨论】:

谢谢,我马上试试。不过有一个问题……这是一种好习惯吗?是否可以将多个文件用于高密度窗口?还是我应该留在网格中?这只是我正在制作的启动画面,所以在这里会很好,但我对未来感到好奇。 @wellinthatcase:老实说,我的经验是直接学习编写 XAML 会更好。我希望 Designer 工作得更好,但我发现它使用起来很烦人,而且使用 Designer 表达布局场景可能很困难,这些场景可以直接编写为 XAML。无论您是否使用设计器,您都可以使用UserControl、模板和单独的资源字典文件来模块化您的 XAML。这与您创作 XAML 本身的方式无关。

以上是关于我应该如何将多个控件添加到 WPF 窗口? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

WPF 将对象从窗口的用户控件传递到另一个窗口的用户控件

如何在WPF窗口中使用WinRT SwapChainPanel控件?

WPF 将窗口控件封装到类库中使用

初学:我现在用VS2010编写WPF应用程序,一个窗口变化到另一个窗口应该怎么跳转?谢谢

测试 WPF 控件而不将其添加到窗口

WPF 如何把子窗口放到主窗口的Panel中?