2015-12-11 22 views
11

Quando ci sono più elementi nella casella combinata, la casella combinata mostrerà il riquadro a comparsa listpicker. Se seleziono il primo e scorri verso il basso, più di un elemento verrà mostrato come selezionato. Ma SelectedItem di ComboBox sarà quello che ho selezionato. Ho modificato lo stile di ListPickerFlyout e disattivato la virtualizzazione di ListView. Se faccio così ListView non manterrà il SelectedItem. Questo bug di ComboBox? C'è qualche soluzione per questo problemawindows phone 8.1 ComboBox mostra più elementi come selezionati quando il numero di elementi è più

Ecco stile che ho modificato

<DataTemplate x:Key="ListPickerFlyoutPresenterContentTemplate" > 
       <ListView VirtualizingStackPanel.VirtualizationMode="Recycling" SelectionMode="Single" > 
        <!--<ListView.ItemsPanel> 
         <ItemsPanelTemplate> 
          <VirtualizingStackPanel/> 
         </ItemsPanelTemplate> 
        </ListView.ItemsPanel>--> 
        <ListView.ItemContainerStyle> 

          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate TargetType="ListViewItem"> 
             <Border x:Name="OuterContainer" RenderTransformOrigin="0.5,0.5"> 
              <VisualStateManager.VisualStateGroups> 
               <VisualStateGroup x:Name="CommonStates"> 
                <VisualState x:Name="Normal" /> 
                <VisualState x:Name="Pressed"/> 

                <VisualState x:Name="Disabled"/> 
                                         <VisualStateGroup.Transitions> 
                 <VisualTransition From="Pressed" To="Normal" /> 


                </VisualStateGroup.Transitions> 
               </VisualStateGroup> 
               <VisualStateGroup x:Name="SelectionStates"> 
                <VisualState x:Name="Unselected" /> 
                <VisualState x:Name="Selected"> 
                 <Storyboard> 
                  <DoubleAnimation Storyboard.TargetName="CheckGlyph" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
                  <DoubleAnimation Storyboard.TargetName="SelectedCheckMark" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Foreground" Duration="0"> 
                   <DiscreteObjectKeyFrame KeyTime="0" Value="Green" /> 
                  </ObjectAnimationUsingKeyFrames> 
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentBorder" Storyboard.TargetProperty="Background"> 
                   <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListPickerFlyoutPresenterSelectedItemBackgroundThemeBrush}" /> 
                  </ObjectAnimationUsingKeyFrames> 
                 </Storyboard> 
                </VisualState> 
                <VisualState x:Name="SelectedUnfocused"> 
                 <Storyboard> 
                  <DoubleAnimation Storyboard.TargetName="CheckGlyph" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
                  <DoubleAnimation Storyboard.TargetName="SelectedCheckMark" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Foreground" Duration="0"> 
                   <DiscreteObjectKeyFrame KeyTime="0" Value="Green" /> 
                  </ObjectAnimationUsingKeyFrames> 
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentBorder" Storyboard.TargetProperty="Background"> 
                   <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListPickerFlyoutPresenterSelectedItemBackgroundThemeBrush}" /> 
                  </ObjectAnimationUsingKeyFrames> 
                 </Storyboard> 
                </VisualState> 
               </VisualStateGroup> 
               <VisualStateGroup x:Name="DataVirtualizationStates"> 
                <VisualState x:Name="DataAvailable" /> 
                <VisualState x:Name="DataPlaceholder"> 

                </VisualState> 
               </VisualStateGroup> 
               <VisualStateGroup x:Name="MultiSelectStates"> 
                <VisualState x:Name="NoMultiSelect" /> 
                <VisualState x:Name="ListMultiSelect"> 

                </VisualState> 
                <VisualState x:Name="GridMultiSelect" /> 
                <VisualStateGroup.Transitions> 
                 <VisualTransition From="ListMultiSelect" To="NoMultiSelect" GeneratedDuration="0:0:0.15" /> 
                 <VisualTransition From="NoMultiSelect" To="ListMultiSelect" GeneratedDuration="0:0:0.15" /> 
                </VisualStateGroup.Transitions> 
               </VisualStateGroup> 
               <!--<VisualStateGroup x:Name="HighlightStates"> 
                <VisualState x:Name="NoHighlight" /> 
                <VisualState x:Name="Highlighted"> 
                 <Storyboard> 
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Foreground" Duration="0"> 
                   <DiscreteObjectKeyFrame KeyTime="0" Value="Red" /> 
                  </ObjectAnimationUsingKeyFrames> 
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentBorder" Storyboard.TargetProperty="Background"> 
                   <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListPickerFlyoutPresenterSelectedItemBackgroundThemeBrush}" /> 
                  </ObjectAnimationUsingKeyFrames> 
                 </Storyboard> 
                </VisualState> 
               </VisualStateGroup>--> 
              </VisualStateManager.VisualStateGroups> 

                  <Grid> 
                   <ContentPresenter x:Name="contentPresenter" 
             ContentTransitions="{TemplateBinding ContentTransitions}" 
             ContentTemplate="{TemplateBinding ContentTemplate}" 
             Content="{TemplateBinding Content}" 
             HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
             VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
             Margin="{TemplateBinding Padding}" 
             Style="{ThemeResource FlyoutPickerListViewItemContentPresenterStyle}" /> 
                   <!--The 'Xg' text simulates the amount of space one line of text will occupy. 
              In the DataPlaceholder state, the Content is not loaded yet so we 
              approximate the size of the item using placeholder text.--> 
                   <TextBlock x:Name="PlaceholderTextBlock" 
           Opacity="0" 
           Text="Xg" 
           Foreground="{x:Null}" 
           Margin="{TemplateBinding Padding}" 
           IsHitTestVisible="False" 
           AutomationProperties.AccessibilityView="Raw"/> 
                   <Rectangle x:Name="PlaceholderRect" 
           Visibility="Collapsed" 
           Fill="{ThemeResource FlyoutBackgroundThemeBrush}" 
           IsHitTestVisible="False" /> 
                  </Grid> 
                 </Border> 
                </Border> 
               </Border> 
               <Border x:Name="SelectedBorder" 
         IsHitTestVisible="False" 
         Opacity="0" 
         BorderBrush="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}" 
         BorderThickness="{ThemeResource GridViewItemMultiselectBorderThickness}"> 
                <Grid x:Name="SelectedCheckMark" 
         Opacity="0" 
         Height="34" 
         Width="34" 
         HorizontalAlignment="Right" 
         VerticalAlignment="Top"> 
                 <Path x:Name="SelectedEarmark" Data="M0,0 L40,0 L40,40 z" 
         Fill="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}" 
         Stretch="Fill" /> 
                 <Path x:Name="SelectedGlyph" 
         Data="M0,123 L39,93 L124,164 L256,18 L295,49 L124,240 z" 
         Fill="{ThemeResource ListViewItemCheckThemeBrush}" 
         Height="14.5" 
         Stretch="Fill" 
         Width="17" 
         HorizontalAlignment="Right" 
         Margin="0,1,1,0" 
         VerticalAlignment="Top" 
         FlowDirection="LeftToRight" /> 
                </Grid> 
               </Border> 
              </Grid> 
             </Border> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 

        </ListView.ItemContainerStyle> 
        <ListView.Footer> 
         <Border Height="{ThemeResource ListPickerFlyoutFooterThemeHeight}" Width="1" /> 
        </ListView.Footer>      
       </ListView> 
      </DataTemplate> 

Quando seleziono qualche elemento che non andrà a stato visivo selezionato, va in realtà a Evidenziato stato visivo e quando ho fuori la virtualizzazione precedente Stato evidenziato non viene mantenuto

+0

Sono un po 'confuso da quello che si sta descrivendo 'mostra più elementi come selezionato quando il numero di articoli sono more' e poi 'Quando seleziono un oggetto non si passa allo stato visivo selezionato, in realtà passa allo stato di visualizzazione Evidenziato e quando viene disattivato lo stato precedente Evidenziato precedente non viene mantenuto' –

+0

Se non modifico alcuno stile, il comportamento effettivo di combobox è- Seleziona uno elemento dal listpicker e di nuovo vai su listpicker e scorri verso il basso, più di un elemento viene mostrato come selezionato (questo avverrà solo se la casella combinata ha molti elementi) – Archana

+0

Quando seleziono qualche elemento non andrà allo stato visivo selezionato, Veramente andrà in Evidenziato vis stato attuale e quando ho disattivato la virtualizzazione precedente Lo stato evidenziato non verrà mantenuto ---> Quando ho modificato ListPickerFlyoutPresenterContentTemplate ho osservato che quando si fa clic su un oggetto in listpicker (selezionato) si passa sempre allo stato di visualizzazione Evidenziato non selezionato Stato visivo – Archana

risposta

1

Il problema è con la virtualizzazione di listviewitems (è un bug nel controllo).

La soluzione consiste nell'impostare la proprietà CacheLength del pannello degli articoli items di listview.

Il codice è:

<DataTemplate x:Key="ListPickerFlyoutPresenterContentTemplate"> 
    <ListView ItemContainerStyle="{StaticResource ListPickerFlyoutPresenterItemStyle}"> 
     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 
       <ItemsStackPanel CacheLength="10" /> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 

     <ListView.Footer> 
      <Border Height="{ThemeResource ListPickerFlyoutFooterThemeHeight}" 
        Width="1" /> 
     </ListView.Footer> 
    </ListView> 
</DataTemplate> 

La soluzione rimuove l'evidenziazione selction dopo qualche tempo (pochi secondi) solo dopo che l'oggetto è realizzato.

Spero la soluzione va bene altrimenti si dovrà ignorare il PrepareContainerForItemOverride del listview

+0

Controllato il codice. Come hai detto, l'evidenziazione sarà lì per pochi secondi – Archana

+0

Puoi aiutarmi in questo [collegamento] (http://stackoverflow.com/questions/35450295/windows-phone-8-1-music-library-get-current-media -coda) – Archana