2014-01-11 2 views
1

У меня есть очень странный вопрос с моей пользовательской WPF ListBox:WPF Listbox SelectedItem дважды меняя

<Grid Name="root" 
     Margin="4" 
     Grid.IsSharedSizeScope="True"> 
    <StackPanel> 
     <Grid HorizontalAlignment="Stretch"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" 
            SharedSizeGroup="hccFormStyleLabel" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Label Target="{Binding ElementName=Theme}" 
        HorizontalAlignment="Left" 
        Grid.Column="0" 
        Content="Theme:"> 
      </Label> 
      <ListBox Grid.Column="1" 
        Name="Theme" 
        SelectionMode="Single" 
        Background="Transparent"> 
       <ListBox.ItemsPanel> 
        <ItemsPanelTemplate> 
         <WrapPanel Orientation="Horizontal" 
            IsItemsHost="True" /> 
        </ItemsPanelTemplate> 
       </ListBox.ItemsPanel> 
       <ListBoxItem IsSelected="{Binding IsThemeLight}"> 
        <Grid Margin="0 4 4 0" 
          HorizontalAlignment="Center"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition SharedSizeGroup="Content" /> 
         </Grid.ColumnDefinitions> 
         <StackPanel Orientation="Vertical"> 
          <Ellipse Width="16" 
            Height="16" 
            StrokeThickness="1" 
            Stroke="{DynamicResource BlackBrush}" 
            Fill="{DynamicResource BlackBrush}" /> 
          <Label HorizontalAlignment="Center" 
            Content="Light"></Label> 
         </StackPanel> 
        </Grid> 
       </ListBoxItem> 
       <ListBoxItem IsSelected="{Binding IsThemeDark}"> 
        <Grid Margin="0 4 4 0"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition SharedSizeGroup="Content" /> 
         </Grid.ColumnDefinitions> 
         <StackPanel Orientation="Vertical" 
            HorizontalAlignment="Center"> 
          <Ellipse Width="16" 
            Height="16" 
            StrokeThickness="1" 
            Stroke="{DynamicResource BlackBrush}" 
            Fill="{DynamicResource WhiteBrush}" /> 
          <Label HorizontalAlignment="Center" 
            Content="Dark"></Label> 
         </StackPanel> 
        </Grid> 
       </ListBoxItem> 
      </ListBox> 
     </Grid> 
     <Grid HorizontalAlignment="Stretch"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" 
            SharedSizeGroup="hccFormStyleLabel" 
            /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Label Target="{Binding ElementName=accentcolors}" 
        HorizontalAlignment="Left" 
        Grid.Column="0" 
        Content="Accent:"> 
      </Label> 
      <ListBox Grid.Column="1" 
        Name="accentcolors" 
        ItemsSource="{Binding AccentColors, Mode=OneWay}" 
        SelectedItem="{Binding ActiveAccent, Mode=TwoWay}" 
        SelectionMode="Single" 
        Background="Transparent"> 
       <ListBox.ItemsPanel> 
        <ItemsPanelTemplate> 
         <WrapPanel Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}" /> 
        </ItemsPanelTemplate> 
       </ListBox.ItemsPanel> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Grid Margin="0 4 4 0" 
           HorizontalAlignment="Center"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition SharedSizeGroup="Content" /> 
          </Grid.ColumnDefinitions> 
          <StackPanel Orientation="Vertical" 
             HorizontalAlignment="Center"> 
           <Ellipse Width="16" 
             Height="16" 
             Margin="2" 
             HorizontalAlignment="Center" 
             Fill="{Binding ColorBrush}" /> 
           <TextBlock HorizontalAlignment="Center" 
              Text="{Binding Path=Name}" /> 
          </StackPanel> 
         </Grid> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </Grid> 
    </StackPanel> 
</Grid> 

Это оказывает ListBox в следующем стиле:

ABCD

EFGH

IJKL

сейчас, когда я нажимаю один из B - K, то «randomly» выбирает один из других элементов, а не тот, на который я нажал.

Странно, когда я присоединяю отладчик и нахожу шаг за всеми средствами настройки/getters, все это работает. Когда я запускаю его без отладчика (или не прерываю), проблема возникает снова.

Я поставил операторы Log.Info по всем свойствам и сеттерам свойств viewmodel, и, похоже, изначально выбирается правильный элемент. Но после первоначального вызова set_ActiveAccent он снова вызван тем, что мне кажется случайным. Как будто WPF обнаруживает второй щелчок мышью на другом элементе.

Когда я удаляю ItemsPanel (WrapPanel), похоже, что он работает, но с WrapPanel он возвращается к этому странному поведению.

Я исключил привязку «Ширина» (если я удалю это, проблема все еще возникает).

Может ли кто-нибудь сказать мне, что здесь происходит, или как я могу лучше это исследовать?

Редактировать: Хорошо ... это становится более странным. когда я использую правую кнопку мыши, чтобы выбрать один из элементов, он работает нормально. Итак, что-то странное происходит на «щелчке левой кнопкой мыши»

Редактировать: Я сузил его до проблемы с 'SharedSizeGroup'. Я обновил xaml выше, чтобы показать полный xaml, который я использую.

Когда я удаляю SharedSizeGroup = 'hccFormStyleLabel' (в ColumnDefinition), все снова начинает работать. На самом деле не имеет смысла делать ....

Я ХОЧУ использовать эту группу общего размера, потому что в моем приложении я извлек большую часть xaml выше для многократного использования HeaderedContentControl. (для ясности я удалил это в моем примере кода).

Итак, чтобы подвести итог: когда я устанавливаю SharedSizeGroup, я получаю странное двойное (случайное) поведение кликов. Без этого он работает.

Все, что я могу сделать? Может быть, есть еще одно приятное многоразовое решение для выравнивания моих меток форм вместо групп общего размера?

+0

Ваш XAML отлично работает в моей тестовой среде. Пожалуйста, взгляните на свой установщик ActiveAccent, будет ли он вызываться несколько раз из вашего кода (запускается пользователем). – gomi42

+0

Кажется, что список не проблема, а xaml вокруг него. Я сузил его до SharedSizeGroup. См. Обновленный xaml и пояснения. Все еще не исправлено, хотя –

+0

Хм, даже ваша обновленная версия отлично работает на моей машине. – gomi42

ответ

2

Я нашел, что происходит.

Как вы, возможно, подозревали, этот пользовательский интерфейс предназначен для изменения текущей темы и акцента приложения.

Я использую ThemeManager от MahApps.Metro для динамического изменения темы и акцента приложения.

Как выясняется, MahApps ThemeManager вызывает некоторые внутренние методы WPF, чтобы аннулировать системные ресурсы и кеширование (чтобы обойти некоторые проблемы при динамическом изменении ресурсов).

Это противоречит SharedSizeGroup (или рендеринг макета в целом).

В настоящее время я использую пользовательскую сборку MahApps.Metro, где я отключу эту работу.

Сообщаю об этой ошибке MahApps.

Спасибо всем за это!

0

У меня есть аналогичные элементы управления, которые работают так, как ожидалось. Пожалуйста, смотрите.

<ListBox ItemsSource="{Binding AccentColors}" 
       SelectedItem="{Binding SelectedAccentColor, Mode=TwoWay}" 
       Margin="0,0,0,16"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel MaxWidth="{Binding ActualWidth, ElementName=Panel}" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem" BasedOn="{StaticResource FlatListBoxItem}"> 
      <Setter Property="BorderThickness" Value="0"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Width="40" Height="40" Margin="2" > 
       <Rectangle.Fill> 
        <SolidColorBrush x:Name="Brush" Color="{Binding}" /> 
       </Rectangle.Fill> 
      </Rectangle> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Я сузил ее до SharedSizeGroup. xaml и объяснение. –

+0

Я думаю, что с его привязкой может быть ур, вызывающий ваш NotityOfPropertyChanged («SelectedItemProperty»), дважды –

Смежные вопросы