ComboBox - TreeView, закрыть всплывающее окно при выборе элемента? - PullRequest
4 голосов
/ 20 мая 2011

Мне удалось создать ComboBox с древовидным представлением в качестве его itempresenter, используя поведение выбранного элемента здесь.

<Popup x:Name="PART_Popup" AllowsTransparency="true" Focusable="false" IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom">
    <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}">
        <Border x:Name="DropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
        <ScrollViewer>
            <TreeView  x:Name="PART_TreeView" ItemsSource="{TemplateBinding ItemsSource}">
                <Interactivity:Interaction.Behaviors>
                <ComboTreeView:BindableSelectedItemBehaviour SelectedItem="{Binding RelativeSource={RelativeSource AncestorType={x:Type ComboBox} }, Path=SelectedItem, Mode=TwoWay}" />    
                </Interactivity:Interaction.Behaviors>                                                  
                </TreeView>                             
        </ScrollViewer>
        </Border>
    </Microsoft_Windows_Themes:SystemDropShadowChrome>
</Popup>

Правильный выбор элемента в древовидном представлении устанавливает выбранный элемент комбинированного списка.Я не уверен, как закрыть всплывающее окно при выборе.Каждый раз, когда мне нужно выбрать и щелкнуть за пределами элемента управления, всплывающее окно исчезнет.Можно ли это сделать в XAML?

Ответы [ 3 ]

3 голосов
/ 22 мая 2011

Я не верю, что это может быть сделано в XAML, но это может быть сделано в codebehind:

void EnsureComboPopupClosed(ComboBox cb)
{
    if (cb == null || cb.Template == null)
        return;
    Popup popup = cb.Template.FindName("PART_Popup", cb) as Popup;
    if (popup == null)
        return;
    popup.IsOpen = false;
}

Вы можете использовать обработчик событий для вызова этой функции.

0 голосов
/ 25 мая 2011

В поведении BindableSelectedItemBehaviour я добавил следующую логику.Я думаю, я перейду к новому поведению, но это работает.

    private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        this.SelectedItem = e.NewValue;

        var treeView = (TreeView)sender;
        var control = (FrameworkElement)treeView.TemplatedParent;
        ComboBox combo;

        do
        {
            combo = control as ComboBox;

            if (combo != null)
            {
                break;
            }
        }
        while ((control = (FrameworkElement)control.TemplatedParent) != null);

        if (combo == null)
        {
            return;
        }

        Dispatcher.BeginInvoke(new Action(() => combo.IsDropDownOpen = false));
    }
0 голосов
/ 25 мая 2011

Я сделал это в xaml ala Event Trigger. Если у кого-то есть какие-либо оптимизации для этого, то, конечно, пожалуйста, предложите прочь, я довольно зелен с этим.

UPDATE ... и это частично работает, за исключением того, что теперь ComboBox больше не открывается после того, как вы выбрали и элемент в дереве.

... xmlns:s="clr-namespace:System;assembly=mscorlib" ...
...
<ControlTemplate.Resources>
    ....
    <Storyboard x:Key="ClosePopup"
                Duration="0:0:0"
                Storyboard.TargetName="PART_Popup"
                Storyboard.TargetProperty="IsOpen" >
        <ObjectAnimationUsingKeyFrames>
            <DiscreteObjectKeyFrame KeyTime="0:0:0">
                <DiscreteObjectKeyFrame.Value>
                    <s:Boolean>False</s:Boolean>
                </DiscreteObjectKeyFrame.Value>
            </DiscreteObjectKeyFrame>
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
    ...
</ControlTemplate.Resources>
    ...
    <TreeView  x:Name="PART_TreeView" ... >
        ...
        <TreeView.Triggers>
            <EventTrigger RoutedEvent="TreeView.SelectedItemChanged">
                <EventTrigger.Actions>
                    ...
                    <BeginStoryboard Storyboard="{StaticResource ClosePopup}"/>
                </EventTrigger.Actions>
            </EventTrigger>
        </TreeView.Triggers>
        ...
    </TreeView>
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...