MenuItem с всплывающим текстовым полем - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть WPF ContextMenu с MenuItems, которые поддерживают пользовательский стиль.MenuItem - кнопка переключения.Когда флажок ToggleButton установлен, появляется всплывающее окно с текстовым полем и кнопкой закрытия.

<Style TargetType="MenuItem">
        <Setter Property="Foreground" Value="{StaticResource ForegroundColor}"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="MenuItem" >
                    <Grid>
                        <Border Name="Border" Height="25"
                        Background="{StaticResource BackgroundColor}">
                            <ToggleButton Name="tbtnOpenPopup">
                                <ToggleButton.Style>
                                    <Style TargetType="ToggleButton">
                                        <Setter Property="OverridesDefaultStyle" Value="True"/>
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="ToggleButton">
                                                    <Border Name="externalBorder" Background="Transparent"
                                                        BorderThickness="0">
                                                        <ContentPresenter Content="{TemplateBinding Content}"
                                                                      HorizontalAlignment="Stretch" 
                                                                      VerticalAlignment="Center"/>
                                                    </Border>
                                                    <ControlTemplate.Triggers>
                                                        <Trigger Property="IsMouseOver" Value="true">
                                                            <Setter TargetName="externalBorder" Property = "Background" Value="{StaticResource DropDownHighlightedBackgroundColor}"/>
                                                        </Trigger>
                                                    </ControlTemplate.Triggers>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </ToggleButton.Style>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition Width="7"/>
                                    </Grid.ColumnDefinitions>
                                    <ContentPresenter ContentSource="Header" VerticalAlignment="Center"
                                                      Margin="10,0,0,0"/>
                                    <Path Name="Arrow" Grid.Column="1"
                                          Data="M0,3 L5,0 L0,-3 L0,3 Z"
                                          Fill="{TemplateBinding Foreground}"
                                          VerticalAlignment="Center"/>
                                </Grid>
                            </ToggleButton>
                        </Border>
                        <Popup Grid.ColumnSpan="2"
                            Name="Popup"
                            Placement="Right"
                            AllowsTransparency="True" 
                            Focusable="False"
                            StaysOpen="True"
                            IsOpen="False"
                            PopupAnimation="None">
                            <Grid Name="DropDown"
                            SnapsToDevicePixels="True"                
                            MinWidth="{TemplateBinding ActualWidth}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition Width="22"/>
                                </Grid.ColumnDefinitions>
                                <Border MinHeight="25" Grid.ColumnSpan="2"
                                    x:Name="DropDownBorder"
                                    Background="{StaticResource DropDownBackgroundColor}"
                                    BorderThickness="0"/>
                                <TextBlock Text="Some text" VerticalAlignment="Top"
                                       HorizontalAlignment="Stretch"/>
                                <Button Name="closeButton" 
                                    Content="X"
                                    Grid.Column="1"
                                    VerticalAlignment="Top"
                                    HorizontalAlignment="Right"/>
                            </Grid>
                        </Popup>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger SourceName="tbtnOpenPopup" Property="IsChecked" Value="true">
                            <Setter TargetName="Popup" Property="IsOpen" Value="true"/>
                            <Setter TargetName="Arrow" Property="Data" Value="M5,3 L0,0 L5,-3 L5,3 Z"/>
                        </Trigger>
                        <Trigger SourceName="closeButton" Property="IsPressed" Value="true">
                            <Setter TargetName="tbtnOpenPopup" Property="IsChecked" Value="false"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Я хочу, чтобы всплывающее текстовое поле закрывалось при нажатии кнопки closeButton, а ContextMenu оставалось открытым.Но когда «closeButton» нажал на закрытие ContextMenu.

Я не мог понять, почему он счастлив.

У вас есть идеи?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Требование этого типа требует реализации настраиваемого контекстного меню на основе всплывающих окон, поскольку контекстные меню будут закрываться (даже если StaysOpen имеет значение true), после того, как что-то еще за пределами контекстного меню окажется в фокусе (в вашем случае кнопка закрытия на основе всплывающих окон) .

(

0 голосов
/ 15 сентября 2011

Вообще говоря, контекстное меню закроется, когда фокус будет установлен в другом месте.Нажатие на ToggleButton находится в ContextMenu, так что это нормально, но когда вы нажимаете кнопку закрытия, вы щелкаете за пределами ContextMenu, и оно закрывается.

(Помните, что ContextMenu является всплывающим, а невизуального дерева управления владельцем.)

...