首页 > 解决方案 > WPF 托管 winforms 控件 - 仅在窗口或控件调整大小时重新计算高度

问题描述

我有一个在 WPF 上运行的应用程序窗口。在这个窗口内部,我有一个选项卡项,它是 WPF UserControl(如下所示的解释器选项卡)。在这个用户控件内部,我有一个停靠面板,其中包含 Grid 的最后一个子项,其中包含下面控件的中间部分(十六进制框、网格拆分器和右侧的树视图)。

在此处输入图像描述

Hexbox 是 Be.winforms.hex.hexbox 的一个实例,它是一个 winforms 控件。我发现没有 WPF hexbox 是可以接受的替代品(我已经尝试了几个)。所以这个控件嵌入在 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 为空。里面没有数据。我看到的是,当通过选择左侧的项目填充 hexbox 数据时,控件将其高度设置为显示所有数据所需的高度(有时是数千字节 - 超出应用程序)。

这会导致滚动条不出现,默认情况下最终用户意味着您无法滚动。我也无法以编程方式滚动到选定的字节(通过单击右侧树上的内容),因为没有实际滚动。

但是,如果我拖动 gridsplitter 以使控件调整大小(或调整窗口大小),则会重新计算大小并显示滚动条。

在此处输入图像描述

我无法弄清楚如何自动正确触发此行为,因此用户不必这样做。这很烦人,因为它经常出现。我不确定我是否应该绑定一些东西,但我不知道这两个项目是如何工作的。

我在这里提交了我的代码,突出显示了该行:https ://github.com/Mgamerz/ME3Explorer/blob/05309979cdebaecea4005620bacd855d20248458/ME3Explorer/Interpreter/InterpreterWPF.xaml#L73

我不知道如何解决这个问题。必须始终调整大小非常令人沮丧,而且我不知道如何调用调整大小代码。我想我可以调整网格拆分器位置的大小,但这似乎是一个真正的黑客,有没有更合适的方法?

标签: c#wpfwinforms

解决方案


推荐阅读