2015-05-28 19 views
5

Ho appena notato questo problema, ogni volta che seleziono un espansore la cui casella di controllo è genitore attiva gli eventi selezionati/non selezionati anche se la casella di controllo non è selezionata.La casella di controllo selezionata e gli eventi non selezionati vengono attivati ​​quando seleziono un expander

Ecco un file .gif che mostra che si sta verificando. Il numero in alto a destra rappresenta il numero di caselle di controllo spuntate, ho impostato per contare solo su e giù ogni volta che una casella è selezionata o deselezionata. Il contatore in sé non è la preoccupazione, però, solo un modo per dimostrarlo.

Per ciascuna casella di controllo, gli eventi Checked e UnChecked indicano un metodo di mia scelta.

enter image description here

che cosa sta causando questo accada, e come posso fare per prevenirlo?

Edit: La XAML

  <Expander Loaded="VerifyExpanderLoaded" ExpandDirection="Down" IsExpanded="True" FontSize="14" FontWeight="Bold" Margin="5" BorderThickness="1" BorderBrush="#FF3E3D3D"> 
      <Expander.Header> 
       <DockPanel RenderTransformOrigin="0.5,0.5" LastChildFill="False" Margin="0" HorizontalAlignment="Stretch"> 
        <TextBlock Text="Verify Caller and Account" DockPanel.Dock="Left" VerticalAlignment="Center" Margin="0"/> 
        <Button DockPanel.Dock="Right" Margin="1,0" Click="VerifyUncheckAll"> 
         <TextBlock Text="Uncheck All" Margin="1,0" FontSize="12" FontWeight="Normal"/> 
        </Button> 
        <Button DockPanel.Dock="Right" Margin="1,0" Click="VerifyCheckAll"> 
         <TextBlock Text="Check All" FontSize="12" FontWeight="Normal" Margin="1,0"/> 
        </Button> 
        <TextBlock x:Name="VerifyCheckboxCount" Text="0/0" DockPanel.Dock="Right" VerticalAlignment="Center" FontSize="16" FontWeight="Bold" Margin="0,0,10,0"/> 
       </DockPanel> 
      </Expander.Header> 
      <ListBox Background="{x:Null}" BorderBrush="{x:Null}"> 
       <CheckBox x:Name="Authentication_CallerName_Checkbox" HorizontalAlignment="Center" Margin="10,5,0,0" Grid.ColumnSpan="2" FontSize="12" VerticalAlignment="Center" Checked="VerifyCheckBoxChecked" Unchecked="VerifyCheckBoxChecked"> 
        <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center"> 
         <TextBlock Text="Caller's Name" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14"/> 
         <StackPanel> 
          <Expander ExpandDirection="Right" Margin="5,2,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Right" FontSize="14"> 
           <TextBlock Text="Obtain Callers Name " HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center" FontWeight="Normal" FontStyle="Italic"> 
           <Hyperlink x:Name="AuthenticationWikiLink" NavigateUri="[Redacted]" RequestNavigate="ExternalLinks"> 
            Link 
           </Hyperlink> 
           </TextBlock> 
          </Expander> 
         </StackPanel> 
        </StackPanel> 
       </CheckBox> 
+1

possiamo avere qualche codice per favore? ci sono problemi vincolanti quando la casella di controllo è posizionata nell'espansione ... – Muds

+1

Perché è necessario evitare che ciò accada? Che problema sta causando? –

+0

Aggiunto in XAML. David, perché sta facendo in modo che il contatore contini la casella di spunta come selezionata o deselezionata in base alla sua proprietà IsChecked quando scatta l'evento. So che ci sono modi per aggirare questo e altri metodi che potrei usare per determinare se è stato controllato o meno. Tuttavia questo è oltre lo scopo di questa domanda. –

risposta

0

cosa sta causando questo accada?

Non so. Immagino che accada a causa di eventi in rotta. Probabilmente è possibile evitare che ciò accada, se si imposta eventArgs come gestito nell'evento corretto.

Come posso prevenirlo?

Innanzitutto, è lo XAML che ho usato. Si basa su una versione semplificata di quella che hai pubblicato.

<CheckBox x:Name="checkbox" Checked="VerifyCheckBoxChecked" Unchecked="VerifyCheckBoxChecked"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Test:" VerticalAlignment="Center"/> 
     <StackPanel> 
      <Expander ExpandDirection="Right" Margin="5,2,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Right" FontSize="14" MouseEnter="Expander_MouseEnter" MouseLeave="Expander_MouseLeave"> 
       <TextBlock Text="Open" VerticalAlignment="Center"/> 
      </Expander> 
     </StackPanel> 
    </StackPanel> 
</CheckBox> 

Ed ecco il cs

public partial class MainWindow : Window 
{ 
    bool mouseOverExpander = false; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void VerifyCheckBoxChecked(object sender, RoutedEventArgs e) 
    { 
     if (!mouseOverExpander) 
     { 
      if (true) ; 
     } 
    } 

    private void Expander_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     mouseOverExpander = true; 
    } 

    private void Expander_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     mouseOverExpander = false; 
    } 
} 

Questo non impedisce l'VerifyCheckBoxChecked indesiderate chiama, ma li filtra.