У меня есть проект WPF, в котором я поддерживаю соотношение сторон видео, размещая элементы управления видео внутри ViewBox. Элемент управления видео - это объект WinForms, заключенный в WindowsFormsHost. Я также добавил gridSplitter, чтобы изменить размер ViewBox. Все работало отлично, пока я не заметил странную ошибку. Когда я использовал элемент управления gridSplitter, чтобы минимизировать ViewBox близко к нулю, соотношение видео было бы испорчено после его повторного расширения. И когда я использовал gridSplitter, чтобы сузить ViewBox до 0, WindowsFormHost полностью исчезнет после расширения (он все еще там, но теперь ActualWidth и ActualHeight равны 0).
Удаление элемента управления ViewBox и простое использование WindowsFormsHost работает нормально, но мне нужен ViewBox для управления соотношением сторон. Если я не могу найти решение, мне придется самостоятельно контролировать соотношение в качестве обходного пути.
Я решил, что что-то делаю не так, поэтому написал программу быстрой проверки, которая воспроизводит проблему. Я размещу ссылку на полную программу ниже (она на C #, VS2008).
В тестовой программе я создаю сетку из двух столбцов с разделителем сетки, который позволяет изменять их размер. Затем я помещаю ViewBox в левый элемент управления и помещаю в него WindowsFormsHost. Затем я размещаю красный _winFormsButton внутри WindowsFormsHost.
Кнопка отлично масштабируется, пока вы полностью не сожмете левый столбец, а затем снова не развернете его. Кнопки больше нет. Как мне предотвратить это, чтобы кнопка продолжала масштабироваться после сжатия и расширения левого столбца? Спасибо.
XAML:
<Window x:Class="DisappearingHost.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.5*" />
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="1" HorizontalAlignment="Left" Name="gridSplitter1" Width="10" VerticalContentAlignment="Center" />
<Viewbox>
<WindowsFormsHost Name="windowsFormsHost1" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Viewbox>
</Grid>
</Window>
Код позади:
public partial class Window1 : Window
{
System.Windows.Forms.Button _winFormsButton = new System.Windows.Forms.Button();
public Window1()
{
InitializeComponent();
_winFormsButton.Text = "I disappear!";
_winFormsButton.Size = new System.Drawing.Size(50, 50);
_winFormsButton.BackColor = System.Drawing.Color.Red;
windowsFormsHost1.Child = _winFormsButton;
}
}
Пример вывода кода:
Ссылка на код тестового проекта (VS2008): код