C# WPF列表框选择编辑项更改两次(错误?)
我的自定义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
<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”);两次