открытие окна winform пользовательского элемента управления WPF сжимает родительское окно winform

У меня есть такой пользовательский элемент управления WPF ...

namespace WpfApplication1
{
    public partial class MyControl : UserControl
    {
    ......
    }
}

У меня также есть выигрышная форма, содержащая этот пользовательский элемент управления WPF ...

namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{

    public Form1()
    {

        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ElementHost ctrlHost = new ElementHost();
        ctrlHost.Dock = DockStyle.Fill;
        WpfApplication1.MyControl win = new WpfApplication1.MyControl();
        ctrlHost.Child = win;
        this.Controls.Add(ctrlHost);
    }
}
}

У меня есть еще одна форма родительского выигрыша с кнопкой. При нажатии на кнопку откроется форма Form1, содержащая ElementHost.

namespace WindowsFormsApplication4
{
    public partial class Parent : Form
    {
        public Parent()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1 form1 = new Form1();
            form1.Show();

        }
    }
}

Мое приложение по умолчанию запускает родительскую форму ...

Application.Run(new Parent());

Проблема, с которой я столкнулся, странная. Когда я запускаю приложение, открывается родительская форма, и при нажатии кнопки открывается форма дочернего окна, содержащая элемент управления WPF. Но проблема в том, что размер окна родительской формы автоматически уменьшается (окно смещается, восстанавливается, а элементы управления и шрифт в нем становятся меньше), как только появляется форма элемента управления WPF. Если я прокомментирую содержимое функции Form1_Load, то родительское окно не сжимается. Чтобы проверить худший случай, я прокомментировал все в Form1_Load, кроме

ElementHost ctrlHost = new ElementHost();

линия. Само присутствие этой линии заставляет родительскую форму сокращаться, как я упоминал ранее. Я попытался найти эту проблему в Интернете. Я не смог найти решения. Пожалуйста, помогите мне с ответом. Я изможден....


person balaji    schedule 16.10.2014    source источник
comment
codeproject.com/Tips/130414/Host-Windows- Form-Controls-in-WPF, пожалуйста, просмотрите эту ссылку, я думаю, укажите ширину и высоту вашей оконной формы, а затем попытайтесь загрузить свой дочерний пользовательский элемент управления. Поскольку из-за того, что дочерний элемент добавляет контент в вашу форму, он узнает, что ему требуется больше места, поэтому он сжимается.   -  person Ashok Rathod    schedule 17.10.2014
comment
спасибо за комментарии Ашок. Я попытался установить ширину и высоту родительского окна. Но все же существует та же проблема ...   -  person balaji    schedule 17.10.2014
comment
Есть ли в этом прогресс? У меня точно такая же проблема.   -  person user958578    schedule 12.02.2015
comment
Есть такая же проблема. Любые идеи?   -  person dten    schedule 22.03.2015


Ответы (1)


Выше я прокомментировал, что у меня была такая же проблема, и с тех пор я ее решил. Я пишу здесь свои изменения для всех остальных.

Как отмечалось выше, такое поведение возникает всякий раз, когда используется масштабирование пользовательского интерфейса Windows в приложении WinForms, а компилятор Just In Time (JIT) обрабатывает что-либо из библиотек WPF. В моем случае это произойдет, если ввести метод, содержащий код, открывающий WPF-версию MessageBox. Обычно Windows выполняет базовое масштабирование за вас, визуализируя растровое изображение за пределами экрана, а затем отрисовывая его на экране, но в увеличенном масштабе. Когда WPF загружается, кажется, что он берет верх, как будто он говорит Windows: «Эй ... я понял ...». После этого Windows перестает масштабировать WinForms для вас, и вы получаете версию с масштабированием 1x и часто некоторые запутанные элементы управления. Однако часть WPF обрабатывает собственное масштабирование и выглядит нормально.

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

<asmv3:application>
  <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    <dpiAware>true</dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

ИЛИ раскомментируйте следующий раздел, если он там уже есть:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
  </windowsSettings>
</application>

Вы можете добавить файл манифеста:

Right click on application project -> Add -> New item... -> Application Manifest File

Затем в...

Application Project -> Properties -> Application -> Resources

Убедитесь, что для параметра "Манифест" установлено значение app.manifest.

Теперь вы можете найти этот файл и добавить указанный выше XML в корневой <asmv1:assembly>element.

Если вы взяли манифест приложения по умолчанию и добавили этот элемент, он, вероятно, будет выглядеть примерно так

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"  xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
    </security>
  </trustInfo>
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</asmv1:assembly>

Теперь, когда вы запустите приложение WinForms, вы заметите, что оно намного четче, потому что оно отображается с высоким dpi вместо 96 dpi, а затем масштабируется, чтобы заполнить пространство.

Вы, вероятно, заметите, что многие ваши изображения сжались !! В моем случае кнопки, MenuStripItems и ToolStripItems не масштабировались должным образом.

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

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);
}

Это вызывается, когда приложение запускается и фильтрует ваши элементы управления из основной формы. Моя Windows установлена ​​на 200%, режим масштабирования моей основной формы был установлен на DPI, и все формы были разработаны в масштабе 100% (96 dpi). Я изменил все в своих первых попытках исправить проблему, чтобы унаследовать режим масштабирования, и это было то, что у меня сработало, если вы используете шрифт или нет, я подозреваю, что он будет работать точно так же, но я не пробовал.

Поскольку у меня было 200% масштабирования пользовательского интерфейса, когда этот метод назывался factor был просто {2.0, 2.0}, который я затем использовал для воссоздания масштабированного Image в Buttons и для увеличения ImageScalingSize на каждом из Items MenuStrip и ToolStrip, поскольку они не получите вызов ScaleControl. Если вы никогда не добавляли приведенный выше XML, этот метод все равно вызывается, но всегда будет иметь только {1.0, 1.0} для фактора, что бесполезно. Примечание: если вы используете список изображений, тогда не устанавливайте изображение динамически, если в режиме DesignMode или ImageList будут отключены, а при сохранении ничего не будет установлено.

Также не тот фактор, который зависит от силы тока. Вы заметите, что если вы переместите приложение между разными мониторами с разрешением dpi, вы получите 2,0, затем 0,5, затем 2,0, затем 0,5 и т. Д.

Теперь мое приложение WinForms выглядит очень четким и может вызывать элементы пользовательского интерфейса WPF, не сходя с ума! yyayyyyy

Надеюсь, это кому-то поможет

person dten    schedule 07.04.2015
comment
Большое спасибо! В моем случае мне пришлось отключить это, чтобы позволить окнам обрабатывать все масштабирование :) - person Jerther; 03.12.2015
comment
Спасибо. Это было полезно. - person Spongebob Comrade; 13.07.2017