C# WPF列表框选择编辑项更改两次(错误?)

C# WPF列表框选择编辑项更改两次(错误?),c#,wpf,listbox,mahapps.metro,C#,Wpf,Listbox,Mahapps.metro,我的自定义WPF列表框有一个非常奇怪的问题: <Grid Name="root" Margin="4" Grid.IsSharedSizeScope="True"> <StackPanel> <Grid HorizontalAlignment="Stretch"> <Grid.ColumnDefinitions> <ColumnDefini

我的自定义WPF列表框有一个非常奇怪的问题:

<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>

这将以以下样式呈现列表框:

A、B、C、D

E F G H

I J K L

现在,每当我点击一个B-K,它“随机”选择一个其他项目,而不是我点击的项目

奇怪的是,当我通过所有属性设置器/获取器附加一个调试器和步骤时,一切都正常。 当我在没有调试器的情况下运行它(或不中断)时,问题再次出现

我将Log.Info语句放在viewmodel属性getter和setter上,看起来一开始选择了正确的项。但是在最初的“set_ActiveAccent call”之后,它再次被调用,在我看来,它是一个随机值。好像WPF检测到第二次鼠标点击另一个项目

当我删除ItemsPanel(WrapPanel)时,它似乎可以工作,但使用WrapPanel时,它又回到了这种奇怪的行为

我排除了“宽度”绑定(如果我删除它,问题仍然存在)

有谁能告诉我这里发生了什么,或者我怎样才能更好地调查这件事

编辑:好的。。。这越来越奇怪了。当我用鼠标右键选择其中一个项目时,它正常工作。所以“鼠标左键点击”发生了一些奇怪的事情

编辑:我把它缩小到了“SharedSizeGroup”的问题。我更新了上面的xaml以显示我使用的完整xaml

当我删除SharedSizeGroup='hccFormStyleLabel'(在列定义上)时,一切又开始工作了。做…真的没有意义

我想使用这个共享大小组,因为在我的应用程序中,我将上面的大部分xaml提取到一个可重用的HeaderedContentControl。(为了清楚起见,我在示例代码中删除了它)

总而言之:当我设置SharedSizeGroup时,我会出现奇怪的双击(随机)行为。没有它,它就可以工作


我能做什么?也许还有另一个很好的可重用解决方案来对齐我的表单标签,而不是共享大小组?

我有一个类似的控件,可以按预期工作。请看一看

<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>

我找到了发生的事情

正如您可能怀疑的那样,此UI用于更改应用程序的当前主题和重音

我正在使用MahApps.Metro的ThemeManager动态更改应用程序的主题和重音

事实证明,MahApps ThemeManager调用一些内部WPF方法使系统资源和缓存无效(以解决动态更改资源时的一些问题)

这与SharedSizeGroup(或通常的布局渲染)冲突

现在,我正在使用MahApps.Metro的定制版本,在这里我禁用了这种变通方法

我将向MahApps报告此错误


谢谢大家的关注

您的XAML在我的测试环境中工作得非常好。请查看ActiveAccent的setter是否会从代码中多次调用(由用户触发)。列表框似乎不是问题所在,而是它周围的xaml。我把范围缩小到了SharedSizeGroup。请参阅更新的xaml和说明。仍然没有修复,即使是你的更新版本也能在我的机器上完美运行。这里绝对不行。它与sharedsizegroup有关。每当我把它取下来,它就开始工作。也许是MahApps的事Metro经理。我看到它进行了一些内部方法调用(即,它调用'typeof(SystemParameters).GetMethod(“InvalidateCache”)Ok..当我不调用MahApps.Metro的ThemeManager时,它也可以工作。我怀疑这些内部方法调用(SystemParameters.InvalidateCache和SystemResources.InvalidateResources)与网格的呈现相冲突。我将其缩小为SharedSizeGroup。请参阅更新的xaml和解释。我认为,由于您的绑定,可能会两次调用NotityOfProperty更改(“SelectedItemProperty”);两次