2016-11-22 4 views
0

Допустим, у меня есть список таможенного контроля:WPF Рендер контроль над другими

<ItemsControl> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ctrl:AutoCompleteTextBox /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</StackPanel> 

Эти элементы управления автозаполнения текстовые поля и я хочу перечислить, чтобы быть оказаны выше остальных элементов управления предложения.

Если я придумываю свой контроль, как это:

<UserControl> 
    <StackPanel Orientation="Vertical"> 
     <TextBox Name="Value" /> 
     <ListView Name="Suggestions" /> 
    </StackPanel> 
</UserControl> 

Когда я заполнить мой ListView, то StackPanel растет, а другой автозаполнения просто сдвинут. Я хочу, чтобы они были охвачены списком предложений.

Я пытался использовать холст с Panel.ZIndex набор свойств к 2000 году, но холст всегда оказывается ниже других элементов:

Canvas fails

Вот XAML:

<UserControl> 
    <StackPanel Orientation="Vertical"> 
     <TextBox Name="Value" /> 
     <Canvas Panel.ZIndex="2000"> 
      <ListView Panel.ZIndex="2000" Name="Suggestions" /> 
     </Canvas> 
    </StackPanel> 
</UserControl> 

Я также пытался использовать PopUp. Он хорошо работает, за исключением того, что всплывающее окно оказываются на верхней части экрана, даже если другое приложение получило фокус:

PopUp fails

Вот является XAML:

<UserControl> 
    <StackPanel Orientation="Vertical"> 
     <TextBox Name="Value" /> 
     <PopUp IsOpen="false"> 
      <ListView Name="Suggestions" /> 
     </PopUp> 
    </StackPanel> 
</UserControl> 

Я открыт для любых других решение, если оно применимо к моему первоначальному требованию.

+0

Я думаю, что ваша стеклянная панель прозрачна, и вы должны дать ей цвет фона. –

+0

Nop, я тоже это пробовал. Как вы можете видеть, полоса прокрутки списка также находится за другими элементами управления. – fharreau

+0

Я подозреваю, что вы должны установить свойство Panel.ZIndex вашего UserControl. В вашем самом верхнем текстовом поле автозаполнения есть самый маленький ZIndex, поэтому каждый элемент управления, который внутри этого UserControl, будет находиться под другим UserControls. Я думаю, вы должны установить ZIndext в UserControl, когда он получит фокус. –

ответ

0

Хотя adorner's solution выглядит правильный способ сделать это делать, пока я не получить работу, я нашел обходной путь с PopUp решение проще, чем одного Даниила. Он состоит из обработки десактивации приложения (например, при переключении на другое приложение):

public AutoCompleteTextBox() 
{ 
    InitializeComponent(); 

    var currentWindow = App.Current.MainWindow; 
    currentWindow.Deactivated += ApplicationDeactivated; 
} 

private void ApplicationDeactivated(object sender, EventArgs e) 
{ 
    this.HidePropositions(); // Here is all my stuff for hiding the suggestions list 
} 
1

Попробуйте установить ZIndex пользовательского элемента управления.

<UserControl Panel.ZIndex="your number"> 
<StackPanel Orientation="Vertical"> 
    <TextBox Name="Value" /> 
    <ListView Name="Suggestions" /> 
</StackPanel> 
</UserControl> 

Может быть, вы должны также попытаться поместить ваш код UserControl в нижней части вашего кода XAML, как это:

<!-- Your Code --> 

<UserControl Panel.ZIndex="your number"> 
<StackPanel Orientation="Vertical"> 
    <TextBox Name="Value" /> 
    <ListView Name="Suggestions" /> 
</StackPanel> 
</UserControl> 
</Window> 
+0

Настройки ZIndex в пользовательском элементе управления не решают проблему. И я не могу переместить мой код управления пользователя внизу окна, потому что он написан в отдельном файле. – fharreau

2

Вы должны использовать и Adorner. Это требует больше работы, однако вы всегда можете контролировать, когда отображать или скрывать контент. Если приложение подходит к фону, вы можете скрыть рекламодателя программно.

Когда вы используете элемент управления, являющийся частью визуального дерева, перекрытие элементов управления определяется их порядком в визуальном дереве. Если вы используете контейнер, который наследуется от Panel, вы можете настроить эту настройку с помощью Z-Order. Однако Z-индекс имеет этот эффект упорядочения только для элементов управления в одном контейнере.

Уклонители, наоборот, не являются частью визуального дерева. Их можно показать выше всего. К сожалению, работа с ними сложнее, чем при регулярном контроле. Рамки на самом деле не ограничивают то, что вы можете или не можете сделать с Adorner. Окончательного ответа нет, так как это зависит от того, как должен себя вести adorner. Например, если вы используете вкладки, вам может потребоваться скрыть отображаемый adorner/popup, когда вкладка будет изменена. Поэтому такое поведение предоставляется программисту.

Всплывающие окна используют внутренности, но есть меньше возможностей скрывать или показывать их. Поэтому я предлагаю использовать adorner и настроить его поведение для вашей конкретной цели.

Вы можете найти более подробную информацию об этой проблеме HERE или HERE

UPDATE:

Я просто проверил, что я использовал, когда я должен был сделать то же самое. Я использовал NonTopmostPoupup с некоторыми изменениями. Насколько я понимаю, именно то, что вы ищете. Поэтому я должен пересмотреть свою точку зрения на управление всплывающим окном против Adorner :)

+0

Можете ли вы помочь с предоставлением некоторого кода? Я попытался сделать то же самое, что и в статье, которую вы предоставляете, но я получаю NullReference в последней строке (var adornerLayer = AdornerLayer.GetAdornerLayer (this.Propositions); var myAdorner = new MyAdorner (this.Propositions); adornerLayer.Add (myAdorner);). Ни один из очевидных элементов не равен нулю во время выполнения и this.Suggestions - это мой ListView. Я сделал все это в конструкторе моего UserControl. К сожалению, все ссылки, приведенные в статье, опущены ... – fharreau

+0

Я нашел обходное решение, но я с нетерпением жду, чтобы он работал с рекламодателями, если у вас есть время для предоставления некоторого кода. Я изменю ответ с вашим решением, если смогу заставить его работать. – fharreau

+0

См. Обновленный ответ. Наделенный Git repo, надеюсь, содержит код, который вы ищете. –

0

Вы должны уметь обходить эту проблему, используя AirspacePopup, так как она «Не всегда на вершине, но размещена относительно окна в который он размещается », как указано в первоначальном посте.

Вы можете увидеть полный код и объяснение в: AirspacePopup by Fredrik Hedblad

Смежные вопросы