У меня есть очень странный вопрос с моей пользовательской 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, я получаю странное двойное (случайное) поведение кликов. Без этого он работает.
Все, что я могу сделать? Может быть, есть еще одно приятное многоразовое решение для выравнивания моих меток форм вместо групп общего размера?
Ваш XAML отлично работает в моей тестовой среде. Пожалуйста, взгляните на свой установщик ActiveAccent, будет ли он вызываться несколько раз из вашего кода (запускается пользователем). – gomi42
Кажется, что список не проблема, а xaml вокруг него. Я сузил его до SharedSizeGroup. См. Обновленный xaml и пояснения. Все еще не исправлено, хотя –
Хм, даже ваша обновленная версия отлично работает на моей машине. – gomi42