Wpf 谷歌图片,如带有细节面板的列表框

Wpf 谷歌图片,如带有细节面板的列表框,wpf,listbox,Wpf,Listbox,你将如何设计一个类似谷歌图片的组件 我不确定如何处理选中时显示在每个图像下的细节面板 详细信息面板: -在两行图像之间显示。 -将左右物品放在适当的位置 解决方案: 感谢LittleBit为问题提供了非常好的解决方案。根据他的提示,我创建了以下通用组件,其中考虑了在准备LittleBit解决方案生产时最终将遇到的一些细节 文件:DetailedList.cs 文件:StretchGrid.cs 内部类拉伸网格:网格 { 专用扩展器(u扩展器),; #区域父面板 公共面板父面板 { 获取{ret

你将如何设计一个类似谷歌图片的组件

我不确定如何处理选中时显示在每个图像下的细节面板

详细信息面板:
-在两行图像之间显示。
-将左右物品放在适当的位置

解决方案:

感谢LittleBit为问题提供了非常好的解决方案。根据他的提示,我创建了以下通用组件,其中考虑了在准备LittleBit解决方案生产时最终将遇到的一些细节

文件:DetailedList.cs

文件:StretchGrid.cs

内部类拉伸网格:网格
{
专用扩展器(u扩展器),;
#区域父面板
公共面板父面板
{
获取{return(Panel)this.GetValue(ParentPanelProperty);}
set{this.SetValue(ParentPanelProperty,value);}
}
公共静态只读DependencyProperty ParentPanelProperty=DependencyProperty.Register(
nameof(ParentPanel)、typeof(Panel)、typeof(StretchGrid)、new PropertyMetadata(null,ParentPanelChanged));
私有静态void ParentPanelChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
var stretchGrid=d作为stretchGrid;
if(stretchGrid==null)返回;
如果(例如,新值为面板)
panel.SizeChanged+=stretchGrid.UpdateMargins;
}
#端区
公共拉伸网格()
{
this.Loaded+=StretchGrid\u Loaded;
}
已加载私有void StretchGrid_(对象发送方,路由目标)
{
_expander=this.FindLogicalParent();
_expander.Expanded+=UpdateMargins;
_expander.SizeChanged+=UpdateMargins;
this.UpdateMargins(null,null);
}
私有void UpdateMargins(对象发送方,路由目标)
{
if(ParentPanel==null)返回;
if(_expander==null)返回;
点增量=_expander.TranslatePoint(新点(0d,0d),父面板);
//创建负边距以允许在边界之外渲染栅格(项目下的整行)
此.Margin=新厚度(-delta.X,0,delta.X+_expander.ActualWidth-ParentPanel.ActualWidth,0);
}
}
文件:DetailedList.xaml


文件:NoButtonExpander.xaml


这就是我到目前为止所做的:-

列出的图像:

单击图像-将在其下方显示详细信息视图:

目前,我没有关闭其他细节视图-因此下面可能会发生。 但是,所有这些需要的是传播一个事件,该事件表示其他项目已被单击。并关闭所有其他详图视图(其mvvm和由bool属性驱动)

======================================================

我有一个基本用户控件,它将以自顶向下的方式加载项:

<Grid>
    <Grid>
        <ScrollViewer>
            <ItemsControl ItemsSource="{Binding GridData, UpdateSourceTrigger=PropertyChanged}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</Grid>

此UserControl本身的每一行(项)都使用另一个ItemsControl。使图像水平排列。此外,每个项目都有一个“详细信息”视图部分(边框的可见性由图像单击控制)


internal class StretchGrid : Grid
{
    private Expander _expander;

    #region ParentPanel
    public Panel ParentPanel
    {
        get { return (Panel)this.GetValue( ParentPanelProperty ); }
        set { this.SetValue( ParentPanelProperty, value ); }
    }

    public static readonly DependencyProperty ParentPanelProperty = DependencyProperty.Register(
        nameof( ParentPanel ), typeof( Panel ), typeof( StretchGrid ), new PropertyMetadata( null, ParentPanelChanged ) );

    private static void ParentPanelChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
    {
        var stretchGrid = d as StretchGrid;
        if( stretchGrid == null ) return;

        if( e.NewValue is Panel panel )
            panel.SizeChanged += stretchGrid.UpdateMargins;
    }
    #endregion

    public StretchGrid()
    {
        this.Loaded += StretchGrid_Loaded;
    }

    private void StretchGrid_Loaded( object sender, RoutedEventArgs e )
    {
        _expander = this.FindLogicalParent<Expander>();

        _expander.Expanded += UpdateMargins;
        _expander.SizeChanged += UpdateMargins;

        this.UpdateMargins( null, null );
    }

    private void UpdateMargins( object sender, RoutedEventArgs e )
    {
        if( ParentPanel == null ) return;
        if( _expander == null ) return;

        Point delta = _expander.TranslatePoint( new Point( 0d, 0d ), ParentPanel );

        //Create negative Margin to allow the Grid to be rendered outside of the Boundaries (full row under the item)
        this.Margin = new Thickness( -delta.X, 0, delta.X + _expander.ActualWidth - ParentPanel.ActualWidth, 0 );
    }
}
 <Style x:Key="{x:Type cc:DetailedList}" TargetType="{x:Type cc:DetailedList}"
       BasedOn="{StaticResource {x:Type ListBox}}">

    <Style.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="NoButtonExpander.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Style.Resources>

    <Setter Property="Grid.IsSharedSizeScope" Value="True"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
    <Setter Property="SelectionMode" Value="Single"/>

    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <WrapPanel Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type cc:DetailedList}}}" 
                           Tag="{Binding RelativeSource={RelativeSource Self}}" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>

    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">

                            <Border Name="Border" SnapsToDevicePixels="True">
                                <Expander Style="{StaticResource NoButtonExpander}" VerticalAlignment="Top"
                                      IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" 
                                      Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}">

                                    <Expander.Header>
                                        <Grid>
                                            <Grid.RowDefinitions>
                                                <RowDefinition SharedSizeGroup="A"/>
                                            </Grid.RowDefinitions>

                                            <ContentPresenter Grid.Row="0"/>
                                        </Grid>
                                    </Expander.Header>

                                    <cc:StretchGrid ParentWrapPanel="{Binding Path=Tag, 
                                        RelativeSource={RelativeSource AncestorType={x:Type WrapPanel}}}">

                                        <ContentPresenter ContentTemplate="{Binding DetailsTemplate, 
                                            RelativeSource={RelativeSource AncestorType={x:Type cc:DetailedList}}}"/>

                                    </cc:StretchGrid>
                                </Expander>
                            </Border>

                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter TargetName="Border" Property="Background"
                                            Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>

                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="ExpanderRightHeaderStyle" TargetType="{x:Type ToggleButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Border Padding="{TemplateBinding Padding}">
                    <Grid Background="Transparent" SnapsToDevicePixels="False">
                        <ContentPresenter HorizontalAlignment="Center" Margin="0,4,0,0" Grid.Row="1" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Top"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="ExpanderUpHeaderStyle" TargetType="{x:Type ToggleButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Border Padding="{TemplateBinding Padding}">
                    <Grid Background="Transparent" SnapsToDevicePixels="False">
                        <ContentPresenter Grid.Column="1" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="ExpanderLeftHeaderStyle" TargetType="{x:Type ToggleButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Border Padding="{TemplateBinding Padding}">
                    <Grid Background="Transparent" SnapsToDevicePixels="False">
                        <ContentPresenter HorizontalAlignment="Center" Margin="0,4,0,0" Grid.Row="1" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Top"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="ExpanderHeaderFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Border>
                    <Rectangle Margin="0" SnapsToDevicePixels="true" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="ExpanderDownHeaderStyle" TargetType="{x:Type ToggleButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Border Padding="{TemplateBinding Padding}">
                    <Grid Background="Transparent" SnapsToDevicePixels="False">
                        <ContentPresenter Grid.Column="1" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="NoButtonExpander" TargetType="{x:Type Expander}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Stretch"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Expander}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="3" SnapsToDevicePixels="true">
                    <DockPanel>
                        <ToggleButton x:Name="HeaderSite" ContentTemplate="{TemplateBinding HeaderTemplate}" ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}" Content="{TemplateBinding Header}" DockPanel.Dock="Top" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FocusVisualStyle="{StaticResource ExpanderHeaderFocusVisual}" FontStyle="{TemplateBinding FontStyle}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" MinWidth="0" MinHeight="0" Padding="{TemplateBinding Padding}" Style="{StaticResource ExpanderDownHeaderStyle}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        <ContentPresenter x:Name="ExpandSite" DockPanel.Dock="Bottom" Focusable="false" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </DockPanel>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsExpanded" Value="true">
                        <Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/>
                    </Trigger>
                    <Trigger Property="ExpandDirection" Value="Right">
                        <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Right"/>
                        <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Left"/>
                        <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderRightHeaderStyle}"/>
                    </Trigger>
                    <Trigger Property="ExpandDirection" Value="Up">
                        <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Top"/>
                        <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Bottom"/>
                        <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderUpHeaderStyle}"/>
                    </Trigger>
                    <Trigger Property="ExpandDirection" Value="Left">
                        <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Left"/>
                        <Setter Property="DockPanel.Dock" TargetName="HeaderSite" Value="Right"/>
                        <Setter Property="Style" TargetName="HeaderSite" Value="{StaticResource ExpanderLeftHeaderStyle}"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Grid>
    <Grid>
        <ScrollViewer>
            <ItemsControl ItemsSource="{Binding GridData, UpdateSourceTrigger=PropertyChanged}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</Grid>
<UserControl.Resources>
    <ResourceDictionary>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
    </ResourceDictionary>
</UserControl.Resources>
<Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ItemsControl Grid.Row="0" ItemsSource="{Binding ImagesList, UpdateSourceTrigger=PropertyChanged}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Margin="5" Command="{Binding DataContext.ItemClickedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
                            CommandParameter="{Binding}">
                        <Button.Style>
                            <Style TargetType="Button">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate>
                                            <Grid>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="*"/>
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>
                                                <Image Grid.Row="0" Source="{Binding Image, UpdateSourceTrigger=PropertyChanged}"/>
                                                <TextBlock Name="DisplayText" Grid.Row="1" HorizontalAlignment="Center" Text="{Binding DisplayText, UpdateSourceTrigger=PropertyChanged}"/>
                                            </Grid>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </Button.Style>
                    </Button>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

        <Border Margin="2" Grid.Row="1" Background="Black" Padding="10"
                Visibility="{Binding ShowDetailsPanel, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BooleanToVisibilityConverter}}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Border Grid.Column="0" Background="White" CornerRadius="10">
                    <Image Margin="5" Source="{Binding SelectedImage.Image, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
                <Grid Grid.Column="1">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <TextBlock Grid.Row="0" Margin="20 20 0 0" FontSize="15"
                               Text="{Binding SelectedImage.ImageName, StringFormat={}Filename: {0}}" Foreground="White"/>
                    <TextBlock Grid.Row="1" Margin="20 20 0 0" FontSize="15"
                               Text="{Binding SelectedImage.Size, StringFormat={}Size: {0} bytes}" Foreground="White"/>
                    <TextBlock Grid.Row="2" Margin="20 20 0 0" FontSize="15"
                               Text="{Binding SelectedImage.Location, StringFormat={}Path: {0}}" Foreground="White"/>
                    <TextBlock Grid.Row="3" Margin="20 20 0 0" FontSize="15"
                               Text="{Binding SelectedImage.CreatedTime, StringFormat={}Last Modified: {0}}" Foreground="White"/>
                </Grid>
            </Grid>
        </Border>
    </Grid>
</Grid>
<!-- Image List with Detail -->
<Style x:Key="PicList" TargetType="{x:Type ListView}">
    <!-- Only one Picture can be selected -->
    <Setter Property="SelectionMode" Value="Single"/>

    <!-- Enable Multi-Line with a WrapPanel Around the Items -->
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <WrapPanel Width="{Binding (ListView.ActualWidth),RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" Tag="{Binding RelativeSource={RelativeSource Self}}" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>

    <!-- Override Display area of the Item -->
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListViewItem}">

                <!-- Define Image Item -->
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <!-- Use Expander Header as Preview/Thumbnail and display Details below when expanded -->
                            <Expander x:Name="PicThumbnail" Style="{StaticResource NoButtonExpander}" IsExpanded="{Binding (ListViewItem.IsSelected), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}" Width="{Binding (ListViewItem.ActualWidth), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}">
                                <Expander.Header>
                                    <!-- Thumbnail/Preview Section -->
                                    <StackPanel>
                                        <Image Source="/XAML;component/Assets/Images/Thumb.png" Height="16" Width="16" />
                                        <Label Content="{Binding Name}"/>
                                    </StackPanel>
                                </Expander.Header>
                                <!-- Self stretching Grid (Custom Control) -->
                                <cc:StretchGrid x:Name="PicDetails" Background="LightGray" ParentWrappanel="{Binding Path=Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type WrapPanel}}}">
                                    <!-- Picture Detail Section (quick & dirty designed, replace later) -->
                                    <Image ClipToBounds="False" Source="/XAML;component/Assets/Images/Highres.png" Width="128" Height="128" HorizontalAlignment="Left" Margin="10,0" />
                                    <Rectangle Fill="Black" Height="128" Width="5" HorizontalAlignment="Left"/>
                                    <Rectangle Fill="Black" Height="128" Width="5" HorizontalAlignment="Right"/>
                                    <StackPanel Margin="150,0">
                                        <Label Content="{Binding Name}"/>
                                        <Label Content="Description: Lorem"/>
                                        <Label Content="Category: Ipsum"/>
                                        <Label Content="Owner: Dolor"/>
                                        <Label Content="Size: 5kB"/>
                                    </StackPanel>
                                </cc:StretchGrid>
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <!-- Brings selected element to front, details see edit -->
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Panel.ZIndex" Value="1" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Setter.Value>
    </Setter>
</Style>
class StretchGrid : Grid
{
    //Reference for parent expander (used to calculate Grid Margin)
    private Expander m_expander;

    //Property for relativesource Binding to Wrappanel in Style
    public WrapPanel ParentWrappanel
    {
        get { return (WrapPanel)this.GetValue(Wrappanel); }
        set { this.SetValue(Wrappanel, value); }
    }

    //DependencyProperty for RelativeSource Binding to Wrappanel in Style (Note: the Binding is set inside the Style, not here programmatically in PropertyMetaData)
    public static readonly DependencyProperty Wrappanel = DependencyProperty.Register("ParentWrappanel", typeof(WrapPanel), typeof(StretchGrid), new PropertyMetadata(null));

    //Constructor
    public StretchGrid() : base()
    {
        Application.Current.MainWindow.Loaded += Init;
        Application.Current.MainWindow.SizeChanged += UpdateMargins;
    }

    private void Init(object sender, RoutedEventArgs e)
    {
        m_expander = (Expander)this.Parent;                 //Change when xaml markup hirarchy changes
        if(m_expander != null)                              //(or make it similar to the Wrappanel with
        {                                                   //RelativeSource Binding)

            m_expander.Expanded += UpdateMargins;             //Update when expander is expanded
            m_expander.SizeChanged += UpdateMargins;          //Update when the expander changes the Size

            //Update all StretchGrids on Initialization
            UpdateMargins(null, null);
        }
    }

    //Calculate Grid Margin when an according Event is triggered
    private void UpdateMargins(object sender, RoutedEventArgs e)
    {
        if(ParentWrappanel != null)
        {
            Point delta = m_expander.TranslatePoint(new Point(0d, 0d), ParentWrappanel);

            //Create negative Margin to allow the Grid to be rendered outside of the Boundaries (full column under the Image)
            this.Margin = new Thickness(-delta.X, 0, delta.X + m_expander.ActualWidth - ParentWrappanel.ActualWidth, 0);
            //Theese Values arent calculated exavtly, just broad for example purpose
        }
    }
}
<Style.Triggers>
    <Trigger Property="IsSelected" Value="True">
        <Setter Property="Panel.ZIndex" Value="1" />
    </Trigger>
</Style.Triggers>