DockPanel изменение размера элементов wpf

Я знаю, что есть несколько примеров, но я хотел бы знать, есть ли альтернативное решение, так что вот :).

У меня есть приложение wpf, которое использует док-панель и имеет метки, отображаемые вверху как «заголовки». Все в порядке, пока я не разверну окно. Метки не изменяются, есть ли способ без использования сетки, чтобы это работало? Я пытался использовать сетку, но затем она отключает мою способность удалять элементы, которые, к сожалению, состыкованы :(. Любая помощь была бы отличной. Я также пытался использовать разделитель сетки, но безуспешно.

Изменить

<Window x:Class="DockPanelTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="1500">

<Window.Resources>
    <LinearGradientBrush x:Key="headerBackground" StartPoint="0,0" EndPoint="0,1">
        <GradientStop Color="#FFEFEEEE" Offset="0"/>
        <GradientStop Color="#E7E7E7E7" Offset="1"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="selectedHeaderBackground" StartPoint="0,0" EndPoint="0,1">
        <GradientStop Color="#F6CD1D" Offset="0"/>
        <GradientStop Color="#EBA32A" Offset="1"/>
    </LinearGradientBrush>
</Window.Resources>
<DockPanel Name="myDockPanel">
        <Label Width="Auto" HorizontalAlignment="Stretch" Name="RockLabel" Content="Rock Properties" Margin="0,0,1,1" DockPanel.Dock="Left" Background="{StaticResource headerBackground}" VerticalAlignment="Top" MouseUp="RockLabel_MouseUp" />
        <Button Width="Auto" Name="CloseRock" HorizontalAlignment="Stretch" Margin="0,0,1,1" Content="X" VerticalAlignment="Top" Height="26" Background="{StaticResource headerBackground}" Click="CloseRock_Click" />
        <Label Width="Auto" Name="ContactsLabel" Margin="0,0,1,1" Content="Contacts" DockPanel.Dock="Left" Background="{StaticResource headerBackground}" VerticalAlignment="Top" MouseUp="ContactsLabel_MouseUp" HorizontalAlignment="Stretch" />
        <Button Width="Auto" Name="CloseContacts" Margin="0,0,1,1" Content="X" VerticalAlignment="Top" Height="26" Background="{StaticResource headerBackground}" HorizontalAlignment="Stretch" Click="CloseContacts_Click" />
        <Label Width="Auto" Name="FluidLabel" Margin="0,0,1,1" Content="Fluid Properties" DockPanel.Dock="Left" Background="{StaticResource headerBackground}" VerticalAlignment="Top" MouseUp="FluidLabel_MouseUp" HorizontalAlignment="Stretch" />
        <Button Width="Auto" Name="CloseFluid" Margin="0,0,1,1" Content="X" VerticalAlignment="Top" Background="{StaticResource headerBackground}" Height="26" Click="CloseFluid_Click" HorizontalAlignment="Stretch" />
        <Label Width="Auto"  Name="RegionsLabel" Margin="0,0,1,1" Content="Regions" DockPanel.Dock="Left" Background="{StaticResource headerBackground}" VerticalAlignment="Top" MouseUp="RegionsLabel_MouseUp" HorizontalAlignment="Stretch" />
        <Button Width="Auto" Name="CloseRegions" Margin="0,0,1,1" Content="X" VerticalAlignment="Top" Background="{StaticResource headerBackground}" Height="26"  Click="CloseRegions_Click" HorizontalAlignment="Stretch"/>
        <Label Width="Auto" Name="ProbabilitiesLabel" Margin="0,0,1,1" Content="Probabilities" DockPanel.Dock="Left" Background="{StaticResource headerBackground}" VerticalAlignment="Top" MouseUp="ProbabilitiesLabel_MouseUp" HorizontalAlignment="Stretch"/>
        <Button Width="Auto" Name="CloseProbabilities" Margin="0,0,1,1" Content="X" VerticalAlignment="Top" Background="{StaticResource headerBackground}" Height="26" Click="CloseProbabilities_Click" HorizontalAlignment="Stretch"/>
        <Label Width="Auto" Name="EconomicsLabel" Margin="0,0,1,1" Content="Economics" DockPanel.Dock="Left" Background="{StaticResource headerBackground}" VerticalAlignment="Top" MouseUp="EconomicsLabel_MouseUp"/>
        <Button Width="Auto" Name="CloseEconomics" Margin="0,0,1,1" Content="X" VerticalAlignment="Top" Background="{StaticResource headerBackground}" Height="26" HorizontalAlignment="Right" Click="CloseEconomics_Click"/>
        <Button Width="Auto" Name="RestoreButton" Content="Restore" Height="32" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Click="RestoreButton_Click"/>
        <Button Width="Auto" Name="RestoreLabels" Content="Restore Labels" Height="32" VerticalAlignment="Center" HorizontalAlignment="Center" Click="RestoreLabels_Click"/>
</DockPanel>

Edit enter image description here

Я хочу, чтобы метка и кнопка соответствовали окну даже сейчас, когда я увеличиваю размер окна, чтобы метки располагались поперек окна.


person Ryan Archibald    schedule 17.09.2015    source источник
comment
Похоже, вы хотите сохранить макет при изменении размера окна. Можете ли вы дать нам более подробную информацию о том, что это за макет? Я не согласен с тем, что использование Grid остановит удаление элементов. Можете ли вы опубликовать какой-нибудь xaml, который воспроизводит проблему?   -  person Gusdor    schedule 17.09.2015
comment
Да, я могу дать вам XAML и C#, если хотите? Может быть, я делаю это неправильно, пытаясь удалить элементы, но сегодня я попробовал, и по какой-то причине это не сработало.   -  person Ryan Archibald    schedule 17.09.2015
comment
Пожалуйста, предоставьте скриншот, чтобы мы знали, о чем мы говорим   -  person nkoniishvt    schedule 17.09.2015
comment
@Gusdor Как бы я тогда использовал сетку, если бы я добавил ее и все еще имел возможность удалить метку, кнопку и столбец для (например, свойств камня)?   -  person Ryan Archibald    schedule 17.09.2015


Ответы (1)


Насколько я понимаю, есть ваши требования:

  • Макет, который масштабируется по мере изменения размера окна
  • Возможность удалять элементы

Это решение является огромным упрощением, но оно должно направить вас на правильный путь.

XAML

<Window x:Class="ResizeSample.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:ResizeSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="Grid_ButtonHost">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Button Click="Button_Remove_Click">Click to remove</Button>
        <Button Click="Button_Remove_Click" Grid.Column="1" Grid.Row="1">Click to remove</Button>
        <Button Click="Button_Remove_Click" Grid.Column="2" Grid.Row="2">Click to remove</Button>
    </Grid>
</Window>

Код позади

namespace ResizeSample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Remove_Click(object sender, RoutedEventArgs e)
        {
            // we gave the hosting grid a name, so now we can remove the sender of the click event from the grid.
            // remember to cast the sender to UIElement!
            Grid_ButtonHost.Children.Remove((UIElement)sender);
        }
    }
}
person Gusdor    schedule 17.09.2015
comment
Да, это точно мои требования, спасибо за это, я предполагаю, что вы можете сделать то же самое со столбцами сетки в коде? - person Ryan Archibald; 18.09.2015