WPF хостинг winforms контроль - высота только пересчитывается на окно или изменение размера элемента управления - PullRequest
0 голосов
/ 23 января 2019

У меня есть окно приложения, которое работает на WPF. Внутри этого окна у меня есть элемент вкладки, который является WPF UserControl (вкладка Интерпретатор, показанная ниже). Внутри этого Usercontrol у меня есть док-панель, которая содержит последний дочерний элемент Grid, который содержит среднюю часть элемента управления ниже (гексбокс, разделитель сетки и вид дерева справа).

enter image description here

Hexbox является экземпляром Be.winforms.hex.hexbox, который является элементом управления winforms. Я не нашел ни одного шестнадцатеричного WPF-файла, который был бы приемлемой заменой (я пробовал несколько) Таким образом, этот элемент управления встроен в WinFormsHost:

<Grid Margin="0,1,0,-1">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="220" MaxWidth="718" Width="285" Name="HexboxColumnDefinition" />
        <ColumnDefinition Width="1" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <!--<control:HexEditor Name="Interpreter_HexBox" Grid.Column="0" Grid.Row="1" Width="Auto" Height="Auto" BytePerLine="4" AllowAutoHightLighSelectionByte="False" StatusBarVisibility="Collapsed" AllowDeleteByte="True" AllowExtend="True" />-->
    <WindowsFormsHost Grid.Row="0" Grid.ColumnSpan="2"   Name="Interpreter_Hexbox_Host" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <hb1:HexBox MinBytesPerLine="4" MaxBytesPerLine="16" ColumnInfoVisible="True" LineInfoVisible="True" Font="Courier New,10" BoldFont="Consolas,10" StringViewVisible="True" SelectionStartChanged="hb1_SelectionChanged" SelectionLengthChanged="hb1_SelectionChanged" VScrollBarVisible="True">
        </hb1:HexBox>
    </WindowsFormsHost>
...

Когда окно инициализируется, гексбокс становится пустым. В нем нет данных. Я вижу, что когда данные в hexbox заполняются путем выбора элемента слева, элемент управления устанавливает его высоту на высоту, которая потребуется для отображения всех данных (иногда это тысячи байтов - за пределами высоты). приложение).

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

Однако, если я перетаскиваю gridsplitter, чтобы элемент управления изменял размеры (или изменял размер окна), размер пересчитывался, и появлялась полоса прокрутки.

enter image description here

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

Здесь у меня есть код для этого коммита с выделенной строкой: https://github.com/Mgamerz/ME3Explorer/blob/05309979cdebaecea4005620bacd855d20248458/ME3Explorer/Interpreter/InterpreterWPF.xaml#L73

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...