WindowsForm размещает элементы в списке WPF — Z-порядке

#wpf #winforms #listbox #z-order #windowsformshost

#wpf #winforms #список #z-порядок #windowsformshost

Вопрос:

Я был в конце веб-страницы и обратно, и, похоже, я не могу найти никакого решения для моей проблемы с WindowsFormsHost с Z-порядком WindowsFormsHost. Моя проблема связана с отображением ListBox, в котором элементы представляют собой элементы управления WinForm, обернутые WindowsFormsHost. При визуализации отображаются все элементы, даже те, которые находятся за пределами списка, что делает весь экран ужасным.

Я прилагаю краткий пример кода. Есть ли у меня какие-либо варианты? Нужно ли мне переосмыслить свой макет?

     <Window x:Class="WFH_ZOrderIssue.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
  xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
  Title="WFH ListBox ZOrder" Height="300" Width="600">
 <Grid>
  <ListBox Background="LightBlue" HorizontalAlignment="Left" ItemsSource="{Binding}" MaxWidth="400" BorderThickness="0" 
     ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.CanContentScroll="False" 
     ScrollViewer.HorizontalScrollBarVisibility="Auto"
     SelectionMode="Extended" x:Name="lstDisplays" 
     >
   <ListBox.ItemTemplate>
    <DataTemplate>
     <ScrollViewer x:Name="viewer" VerticalScrollBarVisibility="Hidden" >
      <wfi:WindowsFormsHost Margin="20,0" x:Name="host">
       <wf:Button Text="WindowFormsHost - The Ugly" />
      </wfi:WindowsFormsHost>
     </ScrollViewer>
    </DataTemplate>
   </ListBox.ItemTemplate>
   <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
     <StackPanel Orientation="Horizontal" />
    </ItemsPanelTemplate>
   </ListBox.ItemsPanel>
  </ListBox>
 </Grid>
</Window>
  

и исходный код:

     /// <summary>
 /// Interaction logic for Window1.xaml
 /// </summary>
 public partial class Window1 : Window
 {
  public Window1()
  {
   InitializeComponent();
   this.DataContext = System.Linq.Enumerable.Range(0, 30);
  }
 }
  

Пожалуйста, помогите 🙂

Ответ №1:

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

Взгляните на эту запись в блоге или здесь, которую вы, возможно, сможете запустить в работу.

Если это не сработает, я предлагаю не размещать WinForms нигде ниже верхнего уровня (т. Е. в окне) и убедитесь, что вы не делаете ничего необычного с макетами.

Комментарии:

1. Обе ссылки больше недоступны