停止组合框关闭

时间:2017-09-26 09:58:47

标签: c# wpf combobox

我正在使用已放置在代码项目(https://www.codeproject.com/Articles/563862/Multi-Select-ComboBox-in-WPF)上的自定义控件MultiSelectComboBox。这个组合框里面有复选框。我想要实现以下目标: 当组合框打开时,我想通过单击“确定/取消”按钮来关闭它。取消将关闭它,并且不会选中任何复选框。当我用鼠标在窗口或其他任何地方点击Ok / Cancel按钮时,我不希望它关闭。 以下是代码的一部分:

<ComboBox x:Name="cmbMultiSelect" Style="{StaticResource MultiSelectComboBoxStyler}">
<ComboBox.ToolTip >
    <ToolTip DataContext="{Binding Path=PlacementTarget.Parent, RelativeSource={x:Static RelativeSource.Self}}">
        <TextBlock TextWrapping="Wrap" Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource CommmaToNewLineConverter}}"/>
    </ToolTip>
</ComboBox.ToolTip>

<ComboBox.ItemTemplate>
    <DataTemplate>
        <CheckBox x:Name="cbSelector"
                  Content="{Binding Title, UpdateSourceTrigger=PropertyChanged}"
                  IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"
                  Tag="{RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}"
                  Click="cbSelector_OnClick"/>
    </DataTemplate>
</ComboBox.ItemTemplate>

现在,我的风格是MultiSelectComboBoxStyler:

<Style x:Key="MultiSelectComboBoxStyler" TargetType="{x:Type ComboBox}">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="FocusVisualStyle" Value="{StaticResource ComboBoxFocusVisual}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="{StaticResource ListBorder}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
<Setter Property="ScrollViewer.PanningMode" Value="Both"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="IsSynchronizedWithCurrentItem" Value="True"/>
<Setter Property="ItemTemplate">
    <Setter.Value>
        <DataTemplate>
            <CheckBox/>
            <!-- Do not really need to specify in this instance, since the ItemTemplate is going to be overwritten -->
        </DataTemplate>
    </Setter.Value>
</Setter>
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="ComboBox">
            <Grid>
                <ToggleButton Name="ToggleButton"
                              Grid.Row="0"
                              Grid.Column="0"
                              Content="{Binding Path=Text, Mode=TwoWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"
                              IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}"
                              Focusable="false"                        
                              ClickMode="Press"
                              HorizontalContentAlignment="Left">
                    <ToggleButton.Template>
                        <ControlTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="18"/>
                                </Grid.ColumnDefinitions>
                                <Border x:Name="Border" 
                                        Grid.ColumnSpan="2"
                                        CornerRadius="2"
                                        Background="White"
                                        BorderBrush="{StaticResource NormalBorderBrush}"
                                        BorderThickness="1,1,1,1" />
                                <Border x:Name="BorderComp" 
                                        Grid.Column="0"
                                        CornerRadius="2" 
                                        Margin="1" 
                                        Background="White"
                                        BorderBrush="{StaticResource NormalBorderBrush}"
                                        BorderThickness="0,0,0,0" >
                                    <TextBlock x:Name="txtOnToggleButton"
                                                   Background="White"
                                                   Text="{Binding Path=Text, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" 
                                                   TextTrimming="WordEllipsis"
                                                   TextWrapping="Wrap"
                                                   Padding="3" />
                                </Border>
                                <Path x:Name="Arrow"
                                      Grid.Column="1"
                                      Fill="{StaticResource GlyphBrush}"
                                      HorizontalAlignment="Center"
                                      VerticalAlignment="Center"
                                      Data="M 0 0 L 4 4 L 8 0 Z"/>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter TargetName="Arrow" Property="Fill" Value="{StaticResource DisabledForegroundBrush}" />
                                </Trigger>
                                <Trigger Property="ToggleButton.IsMouseOver" Value="true">
                                    <Setter TargetName="Border" Property="Background" Value="{StaticResource MouseHoverBrush}" />
                                    <Setter TargetName="txtOnToggleButton" Property="Background" Value="{StaticResource MouseHoverBrush}" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </ToggleButton.Template>
                </ToggleButton>
                <Popup Name="Popup"
                       Placement="Bottom"                        
                       AllowsTransparency="True" 
                       Focusable="False" IsOpen="{TemplateBinding IsDropDownOpen}"
                       PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}">
                    <theme:SystemDropShadowChrome Name="Shdw"
                                                     Color="Transparent"
                                                     MinWidth="{TemplateBinding ActualWidth}"
                                                     MaxHeight="{TemplateBinding MaxDropDownHeight}">
                        <Border x:Name="DropDownBorder"
                                    Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
                                    BorderThickness="1"
                                    BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}">
                            <Grid Name="DropDown" SnapsToDevicePixels="True" MinWidth="{TemplateBinding ActualWidth}" 
                                  MaxHeight="{TemplateBinding MaxDropDownHeight}">
                                <ScrollViewer Name="DropDownScrollViewer" Margin="4,0,4,30" SnapsToDevicePixels="True">
                                    <Grid RenderOptions.ClearTypeHint="Enabled">
                                        <Canvas Height="0" Width="0" HorizontalAlignment="Left" VerticalAlignment="Top">
                                            <Rectangle Name="OpaqueRect"
                                                           Height="{Binding ElementName=DropDownBorder,Path=ActualHeight}"
                                                           Width="{Binding ElementName=DropDownBorder,Path=ActualWidth}"
                                                           Fill="{Binding ElementName=DropDownBorder,Path=Background}" />
                                        </Canvas>
                                        <ItemsPresenter Name="ItemsPresenter"
                                                            KeyboardNavigation.DirectionalNavigation="Contained"
                                                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                    </Grid>
                                </ScrollViewer>
                                <StackPanel Orientation="Horizontal">
                                    <Button Name="btnOk" Content="Ok" VerticalAlignment="Bottom" Margin="2, 0, 2, 2"
                                            Width="50" Height="25"
                                            Background="{StaticResource WindowBackgroundBrush}" 
                                            Command="{Binding OkCommand}">
                                        <Button.Style>
                                            <Style TargetType="Button">
                                                <Setter Property="Visibility" Value="Collapsed"/>
                                                <Style.Triggers>
                                                    <DataTrigger Binding="{Binding Path=ShowFilterButtons, 
                                        RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type controls:MultiSelectComboBox}}}" 
                                                                 Value="True">
                                                        <Setter Property="Visibility" Value="Visible"/>
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </Button.Style>
                                        </Button>
                                    <Button Name="btnCancel" Content="Cancel" VerticalAlignment="Bottom" Margin="2, 0, 2, 2" 
                                            Width="50" Height="25"
                                            Background="{StaticResource WindowBackgroundBrush}"
                                            Command="{Binding CancelCommand}">
                                        <Button.Style>
                                            <Style TargetType="Button">
                                                <Setter Property="Visibility" Value="Collapsed"/>
                                                <Style.Triggers>
                                                    <DataTrigger Binding="{Binding Path=ShowFilterButtons, 
                                        RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type controls:MultiSelectComboBox}}}" 
                                                                 Value="True">
                                                        <Setter Property="Visibility" Value="Visible"/>
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </Button.Style>
                                    </Button>
                                </StackPanel>
                            </Grid>
                        </Border>
                    </theme:SystemDropShadowChrome>
                </Popup>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="HasItems" Value="false">
                    <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                </Trigger>
                <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                    <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                    <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                </Trigger>
                <Trigger SourceName="Popup" Property="Popup.HasDropShadow" Value="true">
                    <Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5"/>
                    <Setter TargetName="Shdw" Property="Color" Value="#71000000"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>

这是我在视图中使用自定义控件的方式:

<controls:MultiSelectComboBox Width="200" Height="30" HorizontalAlignment="Left" DefaultText="All" ItemsSource="{Binding Chains}" SelectedItems="{Binding SelectedChains, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ShowFilterButtons="True"/>

虽然我对WPF很陌生,但我能够理解一些事情,但这个问题再一次令我感到头痛。我被卡住了。我知道切换按钮有一些关系,但解决它没有成功。我很感激能得到的所有帮助。

1 个答案:

答案 0 :(得分:1)

由于您使用的是 multiselectbox 控件,因此您应该添加新的 dependencyproperty

此外,Popup标签应该如下所示

"application/pdf"

ToggleButton 应如下所示:

IsOpen="{Binding Path=IsChecked, ElementName=ToggleButton}"

最后你应该以这种方式使用 MultiSelectCombBox

IsChecked="{Binding Path=ControlComboBox, Mode=TwoWay,
                        RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl},
                        UpdateSourceTrigger=PropertyChanged}"
                                  Command="{Binding PressedCommand}"