Почему мой GridSplitter вообще не работает? - PullRequest
10 голосов
/ 02 июня 2010

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

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

Что мне здесь не хватает?

<Window x:Class="UI.Test"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" Height="300" Width="300">
<Grid>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <StackPanel Background="#feca00" Grid.Column="0">
            <TextBlock FontSize="35" Foreground="#58290A"
               TextWrapping="Wrap">Left Hand Side</TextBlock>
        </StackPanel>
        <GridSplitter/>
        <Border CornerRadius="10" BorderBrush="#58290A"
          BorderThickness="5" Grid.Column="1">
            <TextBlock FontSize="25" Margin="20" Foreground="#FECA00"
               TextWrapping="Wrap">Right Hand Side</TextBlock>
        </Border>
    </Grid>

Ответы [ 2 ]

12 голосов
/ 02 июня 2010

В вашем примере GridSplitter помещается в первый столбец. Я не помню свои правила выравнивания WPF на макушке, но я думаю, что это, вероятно, находится на левой стороне первого столбца. Не совсем то, что вы хотели.

Гораздо проще заставить GridSplitter занимать строку или столбец, чем пытаться поделиться строкой или столбцом с другими элементами управления.

<Window x:Class="UI.Test"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" Height="300" Width="300">
<Grid>
      <Grid>
         <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
         </Grid.ColumnDefinitions>
         <StackPanel Grid.Column="0" Background="#feca00">
            <TextBlock FontSize="35" Foreground="#58290A" TextWrapping="Wrap">
              Left Hand Side
            </TextBlock>
         </StackPanel>
         <GridSplitter
            Width="4"
            Grid.Column="1"
            Background="Red"
            VerticalAlignment="Stretch"
            HorizontalAlignment="Center"/>
         <Border
            Grid.Column="2"
            BorderBrush="#58290A"
            BorderThickness="5"
            CornerRadius="10">
            <TextBlock FontSize="25" Foreground="#FECA00" TextWrapping="Wrap">
              Right Hand Side
            </TextBlock>
         </Border>
      </Grid>
   </Grid>
</Window>
0 голосов
/ 27 марта 2017

Вам не хватает важной концепции Z-Ordering. Элементы управления размещаются в z-порядке в том порядке, в котором вы их перечислили. По сути, ваш разделитель сетки перекрывается последним столбцом. Если вы разместите Grid Splitter над последним столбцом в z-порядке, он должен работать нормально, без дополнительного столбца:

<Window x:Class="UI.Test"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" Height="300" Width="300">
    <Grid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <StackPanel Background="#feca00" Grid.Column="0">
                <TextBlock FontSize="35" Foreground="#58290A" TextWrapping="Wrap">Left Hand Side</TextBlock>
            </StackPanel>
            <Border CornerRadius="10" BorderBrush="#58290A" BorderThickness="5" Grid.Column="1">
                <TextBlock FontSize="25" Margin="20" Foreground="#FECA00" TextWrapping="Wrap">Right Hand Side</TextBlock>
            </Border>
            <GridSplitter Grid.Column="1"/>
        </Grid>
    </Grid>
...