Viewbox заставляет WindowsFormsHost исчезнуть в WPF

У меня есть проект 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;
        }
    }

Пример вывода кода: image

Ссылка на код тестового проекта (VS2008): код


person Eternal21    schedule 31.07.2012    source источник


Ответы (2)


Поместите разделитель сетки в нулевой столбец, чтобы у вас не было битвы за макет WPF. Вот измененный код (обратите внимание на столбец Grid Splitter, выравнивание по горизонтали и поле окна просмотра):

<GridSplitter Grid.Column="0" HorizontalAlignment="Right" Name="gridSplitter1" Width="10" VerticalContentAlignment="Center" />
        <Viewbox Margin="10">
            <WindowsFormsHost Name="windowsFormsHost1" VerticalAlignment="Center" HorizontalAlignment="Center" />
        </Viewbox>

Вы можете сделать поле ViewBox справа, чтобы оно выглядело лучше

person LadderLogic    schedule 31.07.2012
comment
Перемещение GridSplitter не решит проблему. В моем производственном коде элемент управления GridSplitter помещен в отдельный столбец (это рекомендуемая практика), но проблема все еще возникает. - person Eternal21; 01.08.2012
comment
Просто черт возьми, я попробовал ваши изменения, и, как подозревал, это не сработало. Проблема в том, что после того, как область просмотра минимизирована до 0, winformsHost никогда не восстанавливается. - person Eternal21; 01.08.2012
comment
@ Eternal21 - я запуталась. Вы отметили ответ как решение, но ваши комментарии говорят об обратном. Это было решено? - person flamebaud; 09.10.2012
comment
@flamebaud Вы правы, я забыл опубликовать правильный ответ. Исправлено сейчас. Окно просмотра вызывало проблемы, и через некоторое время я отказался от попыток понять, почему именно. От этого было проще избавиться и просто самому регулировать соотношение сторон. - person Eternal21; 10.10.2012

В итоге я избавился от Viewbox и сам контролировал размеры WidowsFormHost.

person Eternal21    schedule 10.10.2012