Масштабирование элемента в Listbox/SurfaceListbox WPF

Я работаю над SurfaceListbox, но я думаю, что логика применима и к обычному списку WPF.

У меня есть список поверхностей с включенной горизонтальной прокруткой. Он содержит около 20 предметов. Поверхностный список будет размещен в центре экрана. Теперь, когда пользователь прокручивает список, элементы перемещаются по горизонтали, и в зависимости от размера каждого элемента в списке я видел, что в любой момент времени на экране видны 3 элемента.

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

Любые указатели на то, как реализовать такую ​​​​функциональность в WPF, были бы замечательными. Поскольку пользователь не делает выбор при прокрутке, я не мог использовать событие selectionchanged, чтобы узнать, какой из них является центральным элементом.


person K Singh    schedule 08.03.2011    source источник


Ответы (2)


Поместите SurfaceListBox в сетку и привяжите ScaleTransform к ползунку с диапазоном от 1 до 5 по центру сетки, используя RenderTransformOrigin="0.5,0.5".

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

Вот вид:

<Window x:Class="SurfaceControls.MainWindow"
    Icon="/Images/logo.gif"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Surface Toolkit Controls" Height="500" Width="600" 
    xmlns:my="http://schemas.microsoft.com/surface/2008" >
  <Window.Resources>
    <DataTemplate x:Key="EquipmentItemStyle">
        <StackPanel Orientation="Vertical">
            <TextBlock Text="{Binding Path=Id}"/>
            <TextBlock Text="{Binding Path=EquipmentName}"/>
            <TextBlock Text="{Binding Path=EquipmentType}"/>
        </StackPanel>
    </DataTemplate>
  </Window.Resources>
  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid RenderTransformOrigin="0.5,0.5"  Grid.Row="0">
        <Grid.RenderTransform>
            <TransformGroup>
                <ScaleTransform 
                    ScaleY="{Binding Path=Value, ElementName=slider}" 
                    ScaleX="{Binding Path=Value, ElementName=slider}"/>
            </TransformGroup>
        </Grid.RenderTransform>
        <my:SurfaceListBox 
                ItemsSource="{Binding Path=Equipment, Mode=TwoWay}" 
                SelectedItem="{Binding Path=SelectedEquipment, Mode=TwoWay}"
                ItemTemplate="{StaticResource ResourceKey=EquipmentItemStyle}" >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"
                                VerticalAlignment="Stretch"
                                HorizontalAlignment="Center"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </my:SurfaceListBox>
    </Grid>
    <StackPanel Grid.Row="1" Orientation="Horizontal">
        <my:SurfaceSlider Ticks="5" 
                                Width="100" 
                                Minimum="1"
                                Interval="1"
                                Maximum="5"
                                x:Name="slider"
                                VerticalAlignment="Center"
                                Margin="4,4,4,4"/>
    </StackPanel>
  </Grid>
</Window>

Здесь эта коллекция связана с ListBox:

private ObservableCollection<Equipment> _equipment = new ObservableCollection<Equipment>();
public ObservableCollection<Equipment> Equipment
{
  get
  {
    return _equipment;
  }
  set
  {
    _equipment = value;
  }
}

И определение модели:

public class Equipment
{
  public int Id { get; set; }
  public string EquipmentName { get; set; }
  public string EquipmentType { get; set; }
}
person Zamboni    schedule 27.03.2011