Add item number [WIP]

This commit is contained in:
qianlifeng
2015-02-09 00:13:08 +08:00
parent 8d33644749
commit b8f829dbc3
6 changed files with 62 additions and 16 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 B

View File

@@ -24,7 +24,7 @@
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="32"></ColumnDefinition> <ColumnDefinition Width="32"></ColumnDefinition>
<ColumnDefinition/> <ColumnDefinition/>
<ColumnDefinition x:Name="contextMenuDefinition" Width="0"/> <ColumnDefinition Width="32" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Image x:Name="imgIco" Width="32" Height="32" HorizontalAlignment="Left" Source="{Binding FullIcoPath,Converter={StaticResource ImageConverter},IsAsync=True}" > <Image x:Name="imgIco" Width="32" Height="32" HorizontalAlignment="Left" Source="{Binding FullIcoPath,Converter={StaticResource ImageConverter},IsAsync=True}" >
</Image> </Image>
@@ -36,13 +36,12 @@
<TextBlock Style="{DynamicResource ItemTitleStyle}" DockPanel.Dock="Left" VerticalAlignment="Center" ToolTip="{Binding Title}" x:Name="tbTitle" Text="{Binding Title}"></TextBlock> <TextBlock Style="{DynamicResource ItemTitleStyle}" DockPanel.Dock="Left" VerticalAlignment="Center" ToolTip="{Binding Title}" x:Name="tbTitle" Text="{Binding Title}"></TextBlock>
<TextBlock Style="{DynamicResource ItemSubTitleStyle}" ToolTip="{Binding SubTitle}" Visibility="{Binding SubTitle, Converter={converters:StringNullOrEmptyToVisibilityConverter}}" Grid.Row="1" x:Name="tbSubTitle" Text="{Binding SubTitle}"></TextBlock> <TextBlock Style="{DynamicResource ItemSubTitleStyle}" ToolTip="{Binding SubTitle}" Visibility="{Binding SubTitle, Converter={converters:StringNullOrEmptyToVisibilityConverter}}" Grid.Row="1" x:Name="tbSubTitle" Text="{Binding SubTitle}"></TextBlock>
</Grid> </Grid>
<Image Grid.Column="2" VerticalAlignment="Center" Margin="5 0 0 0" Width="12" x:Name="contextMenu" Source="Images/menu.png" ToolTip="Shift + Enter to open context menu"></Image> <TextBlock Grid.Column="2" x:Name="tbItemNumber" Style="{DynamicResource ItemNumberStyle}" Text="9"></TextBlock>
</Grid> </Grid>
<DataTemplate.Triggers> <DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">
<Setter TargetName="tbTitle" Property="Style" Value="{DynamicResource ItemTitleSelectedStyle}"/> <Setter TargetName="tbTitle" Property="Style" Value="{DynamicResource ItemTitleSelectedStyle}"/>
<Setter TargetName="tbSubTitle" Property="Style" Value="{DynamicResource ItemSubTitleSelectedStyle}"/> <Setter TargetName="tbSubTitle" Property="Style" Value="{DynamicResource ItemSubTitleSelectedStyle}"/>
<Setter TargetName="contextMenuDefinition" Property="Width" Value="{Binding ContextMenu, Converter={converters:ContextMenuEmptyToWidthConverter}}"/>
</DataTrigger> </DataTrigger>
</DataTemplate.Triggers> </DataTemplate.Triggers>
</DataTemplate> </DataTemplate>

View File

@@ -130,21 +130,58 @@ namespace Wox
public List<Result> GetVisibleResults() public List<Result> GetVisibleResults()
{ {
var theStackPanel = GetInnerStackPanel(lbResults);
List<Result> visibleElements = new List<Result>(); List<Result> visibleElements = new List<Result>();
VirtualizingStackPanel virtualizingStackPanel = GetInnerStackPanel(lbResults);
for (int i = 0; i < theStackPanel.Children.Count; i++) for (int i = (int)virtualizingStackPanel.VerticalOffset; i <= virtualizingStackPanel.VerticalOffset + virtualizingStackPanel.ViewportHeight; i++)
{ {
ListBoxItem item = lbResults.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
if (i >= theStackPanel.VerticalOffset && i <= theStackPanel.VerticalOffset + theStackPanel.ViewportHeight) if (item != null)
{ {
FrameworkElement element = theStackPanel.Children[i] as FrameworkElement; visibleElements.Add(item.DataContext as Result);
visibleElements.Add(element.DataContext as Result);
} }
} }
return visibleElements; return visibleElements;
} }
private void UpdateItemNumber()
{
VirtualizingStackPanel virtualizingStackPanel = GetInnerStackPanel(lbResults);
int index = 0;
for (int i = (int)virtualizingStackPanel.VerticalOffset; i <= virtualizingStackPanel.VerticalOffset + virtualizingStackPanel.ViewportHeight; i++)
{
index++;
ListBoxItem item = lbResults.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
if (item != null)
{
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(item);
if (myContentPresenter != null)
{
DataTemplate dataTemplate = myContentPresenter.ContentTemplate;
TextBlock tbItemNumber = (TextBlock)dataTemplate.FindName("tbItemNumber", myContentPresenter);
tbItemNumber.Text = index.ToString();
}
}
}
}
private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
private VirtualizingStackPanel GetInnerStackPanel(FrameworkElement element) private VirtualizingStackPanel GetInnerStackPanel(FrameworkElement element)
{ {
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
@@ -189,6 +226,10 @@ namespace Wox
if (e.AddedItems.Count > 0 && e.AddedItems[0] != null) if (e.AddedItems.Count > 0 && e.AddedItems[0] != null)
{ {
lbResults.ScrollIntoView(e.AddedItems[0]); lbResults.ScrollIntoView(e.AddedItems[0]);
Dispatcher.DelayInvoke("UpdateItemNumber", o =>
{
UpdateItemNumber();
}, TimeSpan.FromMilliseconds(3));
} }
} }

View File

@@ -38,6 +38,12 @@
<Setter Property="Foreground" Value="#D9D9D4" /> <Setter Property="Foreground" Value="#D9D9D4" />
<Setter Property="FontFamily" Value="Arial, Serif" /> <Setter Property="FontFamily" Value="Arial, Serif" />
</Style> </Style>
<Style x:Key="BaseItemNumberStyle" TargetType="{x:Type TextBlock}">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="Margin" Value="3 0 0 0" />
<Setter Property="FontSize" Value="22" />
</Style>
<Style x:Key="BaseItemTitleSelectedStyle" TargetType="{x:Type TextBlock}" > <Style x:Key="BaseItemTitleSelectedStyle" TargetType="{x:Type TextBlock}" >
<Setter Property="Foreground" Value="#FFFFF8" /> <Setter Property="Foreground" Value="#FFFFF8" />
<Setter Property="FontSize" Value="16" /> <Setter Property="FontSize" Value="16" />
@@ -55,9 +61,9 @@
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="ListBox"> <ControlTemplate TargetType="ListBox">
<ScrollViewer Focusable="false" Template="{DynamicResource ScrollViewerControlTemplate}"> <ScrollViewer Focusable="false" Template="{DynamicResource ScrollViewerControlTemplate}">
<VirtualizingStackPanel IsItemsHost="True" /> <VirtualizingStackPanel IsItemsHost="True" />
</ScrollViewer> </ScrollViewer>
</ControlTemplate> </ControlTemplate>
</Setter.Value> </Setter.Value>
</Setter> </Setter>

View File

@@ -21,6 +21,9 @@
<Setter Property="Foreground" Value="#333333" /> <Setter Property="Foreground" Value="#333333" />
<Setter Property="FontWeight" Value="Bold" /> <Setter Property="FontWeight" Value="Bold" />
</Style> </Style>
<Style x:Key="ItemNumberStyle" BasedOn="{StaticResource BaseItemNumberStyle}" TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="#A6A6A6" />
</Style>
<Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}"> <Style x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="#A6A6A6" /> <Setter Property="Foreground" Value="#A6A6A6" />
</Style> </Style>

View File

@@ -334,9 +334,6 @@
<Resource Include="Images\file.png"> <Resource Include="Images\file.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource> </Resource>
<Resource Include="Images\menu.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource>
<Resource Include="Images\open.png"> <Resource Include="Images\open.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource> </Resource>