ListView не будет отображаться в TabItem

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

Я создал элемент управления вкладками, и у меня есть «Просмотр карты» и «Просмотр текста». Я еще не начал использовать Map View, поэтому сейчас он пуст. «Текстовое представление» должно иметь в себе ListView и WebBrowser.

У меня были эти элементы в приложении до использования вкладок, и они отображались и работали нормально. Но теперь, когда я пытаюсь поместить их в TabItem, ListView НЕ будет отображаться независимо от того, что я делаю.

WebBrowser отображается нормально, но ListView, несмотря на многочисленные попытки вывести его на передний план, не отображается. Он не будет отображаться на экране дизайна и не будет отображаться при запуске программы. Я могу выбрать его, и если я скопирую и вставлю XAML в другую часть страницы (больше не внутри TabControl), он снова будет хорошо виден. Я понятия не имею, почему это вообще, пытаюсь понять это уже более часа.

    <Grid HorizontalAlignment="Left" Height="506" Margin="278,46,0,0"     VerticalAlignment="Top" Width="753" x:Name="TextMapGrid" Background="#FFEEE1E1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TabControl HorizontalAlignment="Left" Height="21" Margin="-1,-21,0,0" VerticalAlignment="Top" Width="136">
            <TabItem Header="Text View">
                <Grid Background="#FFE5E5E5">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <WebBrowser x:Name="RSSWeb" HorizontalAlignment="Left" Height="363" VerticalAlignment="Top" Width="746" Margin="0,135,-620,-498" Grid.ColumnSpan="2"/>
                    <ListView x:Name="RSSList" HorizontalAlignment="Left" Height="121" VerticalAlignment="Top" Width="746" MouseLeftButtonUp="RSSList_MouseLeftButtonUp" Margin="0,-1,-620,-120" Background="White" Grid.ColumnSpan="2">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Header="Read" Width="50" DisplayMemberBinding="{Binding Read}"/>
                                <GridViewColumn Header="Title" Width="300" DisplayMemberBinding="{Binding Title}"/>
                                <GridViewColumn Header="Date" Width="110" DisplayMemberBinding="{Binding Date}"/>
                                <GridViewColumn Header="Link" Width="343" DisplayMemberBinding="{Binding URL}"/>
                            </GridView>
                        </ListView.View>
                    </ListView>

                </Grid>
            </TabItem>
            <TabItem Header="Map View" Margin="-2,-2,-2,-1">
                <Grid Background="#FFE5E5E5">

                </Grid>
            </TabItem>
        </TabControl>

    </Grid>

person bock.steve    schedule 13.04.2015    source источник


Ответы (1)


Вы помещаете свой список и веб-браузер в сетку с одной ячейкой. Кроме того, удалите атрибуты Margin и Grid.Columnspan в списке и веб-браузере.

Вы можете либо обернуть их в StackPanel, например.

<StackPanel>
    <ListView x:Name="RSSList" HorizontalAlignment="Left" Height="121" VerticalAlignment="Top" Width="746" MouseLeftButtonUp="RSSList_MouseLeftButtonUp" Margin="0,-1,-620,-120" Background="White" Grid.ColumnSpan="2">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Read" Width="50" DisplayMemberBinding="{Binding Read}"/>
                <GridViewColumn Header="Title" Width="300" DisplayMemberBinding="{Binding Title}"/>
                <GridViewColumn Header="Date" Width="110" DisplayMemberBinding="{Binding Date}"/>
                <GridViewColumn Header="Link" Width="343" DisplayMemberBinding="{Binding URL}"/>
            </GridView>
        </ListView.View>
    </ListView>
    <WebBrowser x:Name="RSSWeb" HorizontalAlignment="Left" Height="363" VerticalAlignment="Top" Width="746" Margin="0,135,-620,-498" Grid.ColumnSpan="2"/>
</StackPanel>

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

<Grid Background="#FFE5E5E5">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <WebBrowser Grid.Row="1" ... Rest of code omitted for brevity />
    <ListView Grid.Row="0" ...Rest of code omitted for brevity />
</Grid>

РЕДАКТИРОВАТЬ: Простой пример, демонстрирующий, что концепция работает. Вы можете создать новое окно/пользовательский элемент управления и попробовать приведенный ниже пример кода.

<Grid>
    <TabControl>
        <TabItem Header="Stack Panel example">
            <StackPanel>
                <TextBlock Text="ListView" />
                <ListView Height="100" Margin="2"/>
                <TextBlock Text="Web Browser" />
                <WebBrowser Height="100" Margin="2" />
            </StackPanel>
        </TabItem>
        <TabItem Header="Grid example">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <ListView Grid.Row="0" Height="100" Margin="2"/>
                <WebBrowser Grid.Row="1" Height="100" Margin="2"/>
            </Grid>
        </TabItem>
    </TabControl>
</Grid>
person failedprogramming    schedule 13.04.2015
comment
Ни один из них не работал. Наличие WebBrowser под ListView также не сработало. Кроме того, размещение ListView отдельно на втором элементе вкладки (Header = Map View one) по-прежнему не отображало ListView. Таким образом, то, что оно само по себе находится в своей собственной сетке, все равно не заставит его появиться. - person bock.steve; 13.04.2015
comment
Вы удалили атрибуты Margin в ListView и WebBrowser? - person failedprogramming; 13.04.2015
comment
Для справки, это изображение всего приложения. Пустая серая область в правом верхнем углу — это место, где должен отображаться ListView. Белое поле под ним — это веб-браузер, который все еще отображается. i.imgur.com/CDDegas.jpg - person bock.steve; 13.04.2015
comment
Поля не удалял. РЕДАКТИРОВАТЬ: когда я удалил их, веб-браузер переместился в верхнюю часть сетки табуляции, теперь перекрывая список. - person bock.steve; 13.04.2015
comment
Я отредактировал примеры кода, чтобы переместить WebBrowser ниже ListView. Я также привел простой пример, чтобы показать вам, что эта концепция действительно работает. В WPF вам действительно не следует использовать поля для позиционирования элементов управления. Вы должны использовать контейнеры для управления макетом. - person failedprogramming; 13.04.2015
comment
Ничего не работает, я попробовал ваше решение в новом проекте, и оно сработало нормально. Я собираюсь просто попытаться найти обходной путь, в любом случае спасибо. - person bock.steve; 13.04.2015