Прокрутка WinForms DataGridView в WPF WindowsFormsHost - PullRequest
1 голос
/ 28 февраля 2012

У меня есть Scrollviewer, который содержит фрейм с WindowsFormsHost.WindowsFormsHost содержит DataGridView (пожалуйста, не спрашивайте, почему я не делаю это с элементом управления WPF DataGrid).

Поскольку DataGridView вызывает ошибки отображения при прокрутке с помощью scrollviewer, я отключил scrollviewer и включил прокруткуна моем DataGridView.

    <Grid x:Name="LayoutRoot">
        <WindowsFormsHost HorizontalAlignment="Stretch" Name="_windowsFormsHostGrid" VerticalAlignment="Stretch">
            <Win.Grid:DataGridView x:Name="_buchungGrid" ScrollBars="Both" BorderStyle="None" BackgroundColor="#F7F8FA" CellFormatting="_gridBuchungen_CellFormatting" SelectionChanged="GridSelectionChanged" DoubleClick="_buchungInovaGrid_DoubleClick" AutoSize="True" AutoColumnWidthMode="Window" ZebraColor="LightGray" Anchor="Left" Dock="Fill" />
        </WindowsFormsHost>
    </Grid>

Кажется, это работает.Пока я не изменяю размер окна.Когда я изменяю размер окна (и это приведет к изменению размера всех дочерних элементов, включая scrollviewer, frame и WindowsFormsHost), полосы прокрутки моего DataGridView исчезают, и я больше не могу прокручивать свою сетку.Я могу изменить размер до старого размера окна, но полосы прокрутки все еще скрыты.

Есть идеи, почему это происходит и как это исправить?Я также не уверен, почему они исчезают, потому что я изменяю размер только одного пикселя, и это происходит.

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Учитывая Forms.DataGridView (dgv) внутри Forms.UserControl (myUserControl) внутри WindowsFormsHost, я обнаружил, что DGV дали большие размеры, чем UC, поэтому полосы прокрутки не были видны. (Если UC вместо этого находится в WinForm, полосы прокрутки отображаются, как и ожидалось; похоже, существует проблема с логикой изменения размера внутри WFHost.)

Мне удалось исправить это в обработчике SizeChanged моего UC:

// VB code:
Public Class MyUserControl
...
Private Sub MyUserControl_SizeChanged(sender As Object, e As EventArgs) Handles MyBase.SizeChanged
        ' dgv.Size is much larger than it should be; not sure why.
        ' my dgv has controls above it, but extends all the way to bottom and right;
        ' if yours does not, then subtract more as needed.
        dgv.Size = New Size(Me.Size.Width - dgv.Left, Me.Size.Height - dgv.Top)
End Sub
...
End Class

В результате рисунок WinForms остается в той области, в которой он должен быть; прокрутка производится в WinForms. (НЕ использовать WPF scrollviewer.)


XAML для WPF:

...
xmlns:mywf="clr-namespace:MyWinFormAssembly;assembly=MyWinFormAssembly"
...

<WindowsFormsHost>
    <mywf:MyUserControl />
</WindowsFormsHost>
0 голосов
/ 12 марта 2012

Кажется, нет решения этой проблемы. В итоге я использовал WPG DataGrid и расширил его до нужной мне функциональности.

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

...