4

ここでの問題は、ポップアップ内にリストボックスを作成し、ポップアップの staysopen=false を設定することです。しかし、ポップアップボックスがポップアップするたびに、ポップアップ内の何かをクリックする必要があり(リストボックスで要素を選択するなど)、ポップアップの外側をクリックすると、自動的に閉じます。何もクリックしないと、ポップアップの外側の他の要素をクリックしても、ポップアップは表示されたままになります。ポップアップ内の要素をクリックする必要なく、ポップアップを閉じる必要があります。私に何ができる?これがコードです。このコードへの他のスタイル リンクがいくつかありますが、カラー スタイルだけです。

私のコントロールは、ユーザーがポップアップボックスの上部にあるテキストボックスをクリックすると、リストボックスがポップアップします。ユーザーが何もせずにこの要素の外側の場所をクリックすると、ポップアップ ボックスが閉じます。ありがとう。

次のコードを使用して、Silverlight で実行できます。しかし、wpfのように思えますが、もう機能していません。

popupAncestor = FindHighestAncestor(this.ListBoxPopup); if (popupAncestor == null) { return; } popupAncestor.AddHandler(System.Windows.Controls.Primitives.Popup.MouseLeftButtonDownEvent, (MouseButtonEventHandler)ClosePopup, true);

<Grid x:Name="MainGrid" Margin="0" VerticalAlignment="Center">
    <Grid.RowDefinitions>
        <RowDefinition Height="20"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid Margin="1,1,1,0" x:Name="TopBar"  Visibility="Visible"  Grid.Row="0" Height="20" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="{StaticResource COL_BTN_LIGHT}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="19"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBox x:Name="TextBoxSearchItem"  x:FieldModifier="private" HorizontalAlignment="Stretch" Grid.Column="0" VerticalAlignment="Stretch" BorderThickness="0,0,0,0" Background="Transparent" TextChanged="TextBoxSearchItem_TextChanged"></TextBox>
        <ToggleButton x:Name="DropDownArrorButton" Grid.Column="1" Style="{StaticResource ComboBoxReadonlyToggleButton}"></ToggleButton>
        <!--<TextBlock HorizontalAlignment="Center" Text="Search" Grid.ColumnSpan="2" TextBlock.FontStyle="Italic" Opacity="0.4" VerticalAlignment="Center"/>-->
    </Grid>
    <Grid Grid.Row="1" HorizontalAlignment="Stretch" x:Name="PopupGrid"  Margin="0,1,0,0" >
        <Popup x:Name="ListBoxPopup" StaysOpen="False" x:FieldModifier="private"  IsOpen="{Binding ElementName=DropDownArrorButton, Path=IsChecked, Mode=TwoWay}" 
               AllowsTransparency="true" Margin="0" HorizontalAlignment="Stretch" Placement="Bottom" 
               PlacementTarget="{Binding ElementName=TopBar}"  Opened="OnPopupOpened" Closed="OnPopupClosed"
               HorizontalOffset="{Binding ElementName=PopupGrid, Path=Value, Mode=TwoWay}"
                 VerticalOffset="{Binding ElementName=PopupGrid, Path=Value, Mode=TwoWay}">
            <ListBox x:Name="ListBoxContainer" Width="{Binding ElementName=MainGrid, Path=ActualWidth}" 
                     HorizontalContentAlignment="Stretch" SelectionMode="Single"  Height="200"  Margin="0" 
                     SelectionChanged="ListBoxContainer_SelectionChanged"
                     MouseDoubleClick="ListBoxContainer_MouseDoubleClick">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid HorizontalAlignment="Stretch">
                            <Border BorderBrush="{Binding SearchedBackColor}" BorderThickness="{Binding Indicator}" Width="{Binding ElementName=MainGrid, Path=ActualWidth}">
                                <TextBlock x:Name="ContentText" Text="{Binding Name}" Margin="1,0,0,0"/>
                            </Border>                               
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Popup>                
        <Border x:Name="listBorder" BorderBrush="{StaticResource COL_BTN}" BorderThickness="0,1,0,0" ></Border>     
    </Grid>                 
</Grid>
4

1 に答える 1

0

ポップアップの状態を管理するには、以下に示すように、"IsPopupOpen" のビュー モデルまたはコントロールに依存関係プロパティを作成する必要があります。次に、ToggleButton "IsChecked" とポップアップ "IsOpen" の両方をその DP にバインドできます。

また、トグルボタンで、「Focusable=false」と「IsThreeState=false」を設定します

    public bool IsDropDownOpen
    {
     get { return (bool)GetValue(IsDropDownOpenProperty); }
     set { SetValue(IsDropDownOpenProperty, value); }
    }        

    public static readonly DependencyProperty IsDropDownOpenProperty =
          DependencyProperty.Register("IsDropDownOpen", typeof(bool), typeof(Window), new UIPropertyMetadata(false));

幸運を!

于 2013-02-11T16:22:11.097 に答える