Как установить шаблон для списка в WPF (Windows 10 Weather) - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь создать приложение погоды Windows 10 в WPF, используя C#.Мне нужно иметь Listbox для отображения последних 10-дневного раздела погоды.Я должен установить шаблон для Listbox пунктов.Я пробовал это:

<ListBox Grid.Row="1" x:Name="DailyWeatherListBox">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel>
                <!--...-->
            </StackPanel>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

Это последние 10-дневный раздел погоды (Windows 10 Weather)

Посмотрите Windows 10 Weather.Я поставил этот образ для неиспользования Windows 10. Я также не знаю, как установить Scrollbar в углах Listbox.Я был бы очень благодарен, если бы вы могли помочь.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я бы начал что-то вроде этого:

<ListBox ItemsSource="{Binding WeeklyWeather}"
         SelectedItem="{Binding SelectedDailyWeather, Mode=TwoWay}">

    //Use ItemTemplate to set how item looks "inside"
    //I'll leave design details for you
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Day}"/>
                <Image Source={Binding WheatherPicturePath}/>
                <TextBlock Text="{Binding Temperature}"/>
                <TextBlock Text="{Binding Description}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>

    //ItemsPanel defines container for items. It can be StackPanel, Wrapanel, Grid, etc
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel IsItemsHost="True" Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        //You use this place to design how container normally looks like
                        <Border Background="White">
                            //DataTemplate defined above is placed in ContentPresenter
                            <ContentPresenter />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                //Here we catch "IsSelected" event and re-design our template to visually reflect "selected"
                <Trigger Property="IsSelected" Value="true">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                <Border Background="Gray">
                                    <ContentPresenter />
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>

</ListBox>

Вот пара идей, как для этих привязок.

public class WeatherViewModel
{
    public string Day { get; set; }
    public string WheatherPicturePath { get; set; }
    public string Temperature { get; set; }
    public string Description { get; set; }
}

public class BindedDataContext
{
    public ObservableCollection<WeatherViewModel> WeeklyWeather { get; set; }
    public WeatherViewModel SelectedDailyWeather { get; set; }
    //...
}

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

Для такой полосы прокрутки я бы посмотрел на Изменить шаблон прокрутки в списке

0 голосов
/ 28 ноября 2018

Вы можете установить простой шаблон ListBox, например, так:

<ListBox Grid.Row="1" x:Name="DailyWeatherListBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <!--Insert XAML for One Item-->
                <Label Content="{Binding}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBoxItem>Item 1</ListBoxItem>
    <ListBoxItem>Item 2</ListBoxItem>
</ListBox>

В большинстве сценариев реального мира, где для каждого элемента отображается более одного раза, вы определяете, как вы хотите, чтобы ваши данныеотображаться через DataTemplate.Например, если бы я хотел отобразить как высокую, так и низкую температуру и стилизовать их по отдельности: сначала я бы создал модель DailyWeather в c # и создал для нее DataTemplate, например:

public class DailyWeather
{
    public int High { get; set; }
    public int Low { get; set; }
    // You Would Add All Your Other Data You Want to Display Here
}

В ресурсах вашей страницы (или в другом словаре ресурсов, как в App.xaml):

<Window.Resources>
    <DataTemplate DataType="{x:Type DailyWeather}">
         <Grid>
             <StackPanel>
                 <Label FontSize="18" Content="{Binding High}"/>
                 <Label FontSize="14" Content="{Binding Low}"/>
             </StackPanel>
         </Grid>
    </DataTemplate>
</Window.Resources>

На вашем ListBox не требуется ItemTemplate ...

<ListBox Grid.Row="1" x:Name="DailyWeatherListBox"/>

... потому что, как только вы установите для источника значение List<DailyWeather> (или сделаете привязку, как предполагает ответ Сиима Хааса), ваша программа найдет DataTemplate, который мы определили для объекта DailyWeather, который мы включили в ресурсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...