Szczegóły kontroli użytkownika:

Utworzono kontrolkę listy rozwijanej (jak pole kombi), kliknięcie przycisku strzałki w dół powoduje wyświetlenie listy poniżej pola tekstowego

Ustawiłem właściwość zIndex mojej kontrolki użytkownika

Kwestia:

Przypadek 1: Gdy istnieje inna kontrolka użytkownika (inna niż moja niestandardowa kontrolka użytkownika) i jeśli wyświetlana jest lista rozwijana, inna kontrolka użytkownika ukrywa się za moją kontrolką użytkownika. To jest doskonale OK

Przypadek 2: Istnieją 2 niestandardowe kontrolki użytkownika, jeśli lista jest wyświetlana z pierwszej kontrolki użytkownika, druga kontrolka użytkownika pojawia się na liście. Tutaj mam do czynienia z problemem

XAML mojej kontroli jest jak poniżej

    <UserControlx:Class="UserControls.AutoCompleteComboBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Panel.ZIndex="1110" LostFocus="UserControl_LostFocus" Height="Auto">

        <Canvas Name="MainCanvas">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" MinWidth="150"></ColumnDefinition>
                    <ColumnDefinition Width="20"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBox Name="autoTextBox" Height="20" MinWidth="150" Width="Auto" MinHeight="20" Style="{DynamicResource AutoCompleteBox}" BorderThickness="2"
                     Margin="0,0,0,0" TextWrapping="NoWrap"  Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Top"/>
                <Button Content="6" FontFamily="Marlett" Grid.Row="0" Grid.Column="1" FontSize="15" Margin="0,0,0,0" Height="20" Width="20" HorizontalAlignment="Right" VerticalAlignment="Top" Background="{StaticResource BackgroudBlueBrush}"  Click="Button_Click" Padding="0" Cursor="Hand"></Button>
                <StackPanel Grid.Row="1" Grid.ColumnSpan="2" >
                    <ListBox Name="suggestionListBox" SelectionChanged="suggestionListBox_SelectionChanged" MouseDown="suggestionListBox_MouseDown"
                     Background="LightYellow" SnapsToDevicePixels="True"
                     Visibility="Collapsed" 
                     MinWidth="150" IsHitTestVisible="True" MinHeight="70" Height="70"
                     VerticalAlignment="Top" LostFocus="suggestionListBox_LostFocus"/>
                </StackPanel>
            </Grid>
        </Canvas>
</UserControl>
0
Milind 21 lipiec 2011, 14:30

2 odpowiedzi

Najlepsza odpowiedź

Twoje podejście nie jest właściwe do prawidłowego zarządzania nakładaniem się kontrolek. Być może stworzysz jakąś sztuczkę za pomocą właściwości ZIndex, ale to nie będzie rozwiązanie.

Jeśli potrzebujesz kontrolki rozwijanej, najlepszym sposobem jest użycie kontrolki Popup i obejrzenie jej. Zasadniczo tworzy kolejne okno bez obramowania, będąc twoim dzieckiem.

Innym podejściem, może prostszym, ale nie dobrym jak Popup, jest użycie Adornera. Może ta jest najbardziej podobna do twojej.

Twoje zdrowie

0
Mario Vernari 21 lipiec 2011, 15:47
Dzięki za komentarz, też tego spróbuję
 – 
Milind
21 lipiec 2011, 16:29
Dzięki za komentarze. Wyskakujące okienko to dobra opcja, jak powiedziałeś. Właśnie zaktualizowałem XAML, aby zawierał listę Popup i Suggestion wewnątrz tego wyskakującego okienka. Dziękuję wszystkim za pomoc.
 – 
Milind
21 lipiec 2011, 18:22

Czy próbowałeś ustawić ZIndex StackPanel na 1+ zindex kontrolki? Powinno to podnieść część rozwijaną nad innymi instancjami kontroli użytkownika.

Canvas.ZIndex może być używany na StackPanels.

0
Jeff Machamer 21 lipiec 2011, 15:48
Czy muszę to zrobić w czasie wykonywania? Jeśli mam formularz WPF, na którym umieszczam 2 niestandardowe formanty użytkownika ctlControl1 i ctlControl2 jak to ustawić? Proszę zasugeruj...
 – 
Milind
21 lipiec 2011, 16:28