1

В первом столбце ListView текст, который может быть разной длинны. Если длинна текста большая, то в ListView отображается текст не полностью, по размеру заголовка столбца, как я понял, соответственно размер окна не меняется. При этом, если закрыть и открыть окно, то размер первого текстового столбца меняется и весь текст в одной строке, так как нужно отображается, и, размер окна изменяется по содержимому ListView.

XAML:

<Window x:Class="Guess.Yourself.QuestionView"
    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:Guess.Yourself"
    mc:Ignorable="d"
    Title="Архив вопросов" 
    SizeToContent="WidthAndHeight"
    Topmost="True"
    ResizeMode="NoResize"
    WindowStartupLocation="CenterScreen">
<Window.Resources>
    <Style TargetType="GridViewColumnHeader">
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="IsEnabled" Value="False"/>
        <Setter Property="Padding" Value="5, 0, 5, 0"/>
    </Style>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="HorizontalAlignment" Value="Center"/>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="{x:Null}"/>
                <Setter Property="BorderBrush" Value="Gray"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="LightBlue"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ListView Grid.Row="0" Background="Gray" Height="300" ItemsSource="{Binding Questions}">
        <!--<ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" FontSize="32" Foreground="White"/>
            </DataTemplate>
        </ListView.ItemTemplate>-->
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Вопросы">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" FontSize="32" Foreground="White"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Да">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate DataType="{x:Type local:MainWindowViewModel}">
                            <Button Command="{Binding YesCmd}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Нет">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate DataType="{x:Type local:MainWindowViewModel}">
                            <Button Command="{Binding NoCmd}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Не знаю">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate DataType="{x:Type local:MainWindowViewModel}">
                            <Button Command="{Binding DontKnowCmd}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
    <Button Grid.Row="1" Content="Выгрузить архив" Margin="3"/>
</Grid>

На картинке фоном главное окно, где показано строка целиком, а на втором окне показываю, как отображается.

введите сюда описание изображения

На данный момент выяснилось, что ширина ListView определяется длинной первой добавленной строки в ListView, если не закрывать окно, то все остальные строки, которые длиньше первой строки не показываются полностью. Как это исправить? Практические пример, пожалуйста, покажите.)

Genas
  • 153
  • Вообще контрлы наследуют размеры от родителя, чтобы родитель привязался к размерам дочернего контрола, надо втыкать привязки к ActualWidth. Есть еще такой пример, там сделано так, чтобы текст переносился на другую строку, если не влезает в доступный размер ячейки. – aepot Jun 25 '20 at 13:40
  • @aepot Т.е. мне св-ву окна width воткнуть привязку к св-ву ListViewItem width? Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}, Mode=FindAncestor}}" – Genas Jun 25 '20 at 14:23
  • Нет, RelativeSource работает только от дочернего объекта к родителю, наоборот не работает. Можно например переопределить ItemContainerStyle, и дать панели, которую вы туда поместите имя. И можно будет, используя IValueConverter привязать ширину окна к ActualWidth панели. Width панели точно таким же образом к ширине колонки, которая имеет переменную ширину. Но я так никогда не делал, поэтому это только теоретические рассуждения, может оно и будет работать без пересчета ActualWidth через конвертер, но это надо собирать тестовый проект и проверять, а пока у меня возможности такой нет. – aepot Jun 25 '20 at 14:39
  • Даете x:Name="MyControl", а потом Binding ElementName=MyControl, ... – aepot Jun 25 '20 at 14:40
  • @aepot у окна установлено св-во SizeToContent="WidthAndHeight" оно же должно подстраивать размеры окна по размерам содержимого... – Genas Jun 25 '20 at 14:58
  • 1
    @aepot видимо он срабатывает только при запуске окна.. – Genas Jun 25 '20 at 15:13
  • Скорее всего так и есть. Я предагал или нет, попробуйте контрол <Popup> вместо окна. – aepot Jun 25 '20 at 15:31
  • @aepot Не говорили про Popup. На метаните при помощи него устанавливается, что-то на вроде тултипа.) – Genas Jun 25 '20 at 18:14
  • 1
    @aepot плс, можете пример реализации в практический вид сделать? не получается что-то ((( – Genas Jun 26 '20 at 15:57
  • Могу, только попозже, или завтра. А вы напишите конкретную проблему, решение которой я буду показывать. Можно в конец вопроса дописать "Покажите пожалуйста пример, который...". – aepot Jun 26 '20 at 16:36
  • @aepot Сделал. Весь в ожидании.) – Genas Jun 26 '20 at 17:03
  • 1
    Я провел пару часов в поиске сопособа закостылить размер окна так, чтобы он брался из дочернего контрола, и могу практически точно сказать, что это не работает, конвертер работает в дизайнере, но не работает в запущеном приложении. Единственный наверное способ - это вручную реализовать поведение окна в code-behind, то есть в коде класса окна. И вы просите очень и очень странную штуковину, назначение которой не понятно, и как оно должно в идеале бы работать - тоже. Я за несколько лет программирования впервые вижу подобное. Другими словами, я сдаюсь, у меня нет решения. – aepot Jun 27 '20 at 12:42
  • 1
    Я в первом же комментарии скинул вам ссылку на решение, но вы ее почему-то игнорируете, и не говорите, почему. – aepot Jun 27 '20 at 12:47
  • 1
    @aepot Спасибо, за Вашу отзывчивость и помощь в поиске решения. Честно - удивлён, что помогаете. Ну, не нашлось - так не нашлось решения. В этом вопросе не принципиально, потому что можно просто установить ширину у GridViewColumn и сделать TextWrapping="Wrap", чтобы переносило и всё. – Genas Jun 27 '20 at 15:18
  • @aepot Да, конечно, я разобрал вариант в первом комментарии, но там у Вас переопределён шаблон и прочее - это не сложно делается, но мне казалось, что всё ещё проще должно быть. Я начинающий и в моих глазах, пока что, кажется, что за меня уже обо всём подумали. – Genas Jun 27 '20 at 15:24
  • @aepot Если не сложно Вам, оформите ответ, чтобы Вам плюсы достались. – Genas Jun 27 '20 at 15:25
  • GridView - очень неудобный контрол, и мало что умеет. Та же DataGrid не имеет проблем с растягиванием ширины колонок, и нативно его поддерживает. – aepot Jun 27 '20 at 15:27
  • Я не гоняюсь за плюсами, их и так уже достаточно, и ответа у меня нет. – aepot Jun 27 '20 at 15:28
  • @aepot Хотел отблагодарить. – Genas Jun 27 '20 at 16:27

0 Answers0