Простая проблема с панелью в WPF - PullRequest
0 голосов
/ 01 декабря 2011

простое расположение элементов управления в wpf. Есть пользовательский элемент управления с сеткой, в которой есть «панель» на этой панели, в которой есть три элемента, две кнопки и ползунок между ними. Правая кнопка должна быть прикреплена к правой стороне «панели», левая кнопка - к левой стороне «панели», а ползунок должен заполнить все свободное пространство между кнопками. Ширина (и высота) кнопок и сетки будут установлены динамически в коде после. Вопрос в том, какую «панель» я должен использовать и как заставить ее работать с данной задачей? (стек, док-станция - такой функциональности нет даже при такой «горизонтальной растяжке») В WinForms - нет проблем с шириной slider = widthOfGrid - (widtOfBothButtons) Возможно ли это сделать в wpf? Или я должен составить код, как указано выше, в некоторых конструкторских функциях? (оффтоп - для меня это типичная задача для управления wpf, и я удивлен, что у нее слишком мало автоматических решений для ее решения)

код:

<UserControl x:Class="WpfApplication1.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="42" d:DesignWidth="291">
    <Grid x:Name="gridCtrl">
        <Grid.ColumnDefinitions>
            <ColumnDefinition x:Name="clnmLbl" Width="Auto"/>
            <ColumnDefinition x:Name="clnmPnl" />
        </Grid.ColumnDefinitions>

        <Label x:Name="lblText" Grid.Column="0" Content="" VerticalAlignment="Center">

        </Label>
        <DockPanel x:Name="pnlDock" Grid.Column="1">
            <Button x:Name="btnLeft"  HorizontalAlignment="Left" DockPanel.Dock="Left">
            </Button>
        <Border  x:Name="BorderOfSlider"  BorderBrush="#FF000000" BorderThickness="3,3,3,3" CornerRadius="8,8,8,8" >
                <Slider x:Name="sldSlider" HorizontalAlignment="Stretch" VerticalAlignment="Center" >
            </Slider>
            </Border>
        <Button x:Name="btnRight"  HorizontalAlignment="Right" DockPanel.Dock="Right">
            </Button>
        </DockPanel>


    </Grid>
</UserControl>

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Есть несколько способов сделать это:

1) DockPanel .Левая кнопка будет занимать некоторое место с левой стороны DockPanel, правая кнопка будет занимать необходимое пространство с правой стороны оставшегося места.Остальные будут использоваться для отображения ползунка.

<DockPanel>
    <Button DockPanel.Dock="Left">Left button</Button>
    <Button DockPanel.Dock="Right">Right button</Button>
    <Slider />
</DockPanel>

2) Сетка .Создать сетку из 3 столбцов.Левый и правый столбцы займут только необходимое пространство, остальное будет отдано центральному столбцу.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Button Grid.Column="0">Left button</Button>
    <Slider Grid.Column="1" />
    <Button Grid.Column="2">Right button</Button>
</Grid>
0 голосов
/ 01 декабря 2011

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

<DockPanel>
    <Button DockPanel.Dock="Left" Content="Left Button" />
    <Button DockPanel.Dock="Right" Content="Right Button" />
    <Slider />
</DockPanel>

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

Редактировать

Убедитесь, что ваш элемент управления, заполняющий все оставшееся пространство, это элемент последний , добавленный к вашему DockPanel.Если нет, он будет использовать значение по умолчанию DockPanel.Dock="Left"

...