标签: elementhost

如何将WPF大小转换为物理像素?

将WPF(与分辨率无关的)宽度和高度转换为物理屏幕像素的最佳方法是什么?

我在WinForms表单中显示WPF内容(通过ElementHost),并试图找出一些大小调整逻辑.当操作系统以默认的96 dpi运行时,我的工作正常.但是当操作系统设置为120 dpi或其他分辨率时,它将无法工作,因为就WinForms而言,报告其宽度为96的WPF元素实际上将是120像素宽.

我在System.Windows.SystemParameters上找不到任何"每英寸像素数"设置.我确信我可以使用WinForms等效(System.Windows.Forms.SystemInformation),但是有更好的方法吗(阅读:使用WPF API的方式,而不是使用WinForms API并手动进行数学运算)?将WPF"像素"转换为真实屏幕像素的"最佳方法"是什么?

编辑:我也希望在屏幕上显示WPF控件之前执行此操作.看起来像Visual.PointToScreen可以给我正确的答案,但我不能使用它,因为控件还没有父级,我得到InvalidOperationException"这个Visual没有连接到PresentationSource".

wpf dpi elementhost

36
推荐指数
3
解决办法
4万
查看次数

WPF ListView性能非常慢 - 为什么?(ElementHost或其他原因?)

我有一个Windows窗体应用程序,它有一个包含WPF UserControl的ElementHost ......在我的WPF中,我有一个非常简单的ListView:

<ListView Margin="4" ItemsSource="{Binding Notifications}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" />
            <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}" />
            <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" />
            <GridViewColumn Header="City" DisplayMemberBinding="{Binding City}" />
            <GridViewColumn Header="State" DisplayMemberBinding="{Binding State}" />
            <GridViewColumn Header="Zip" DisplayMemberBinding="{Binding Zip}" />
        </GridView>
    </ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)

如果我的源有10个项目,表单加载不到一秒钟.如果我的来源有1000个项目,则需要7秒!我的计时器只考虑加载(而不是获取物品所需的时间).

所以我的问题是:

使用ElementHost是一场表演噩梦吗?

WPF DataBinding是一场性能噩梦吗?

ListView是一块废话吗?(顺便说一句,与WPFToolkit的DataGrid相同的结果)?

wpf performance datagrid listview elementhost

22
推荐指数
3
解决办法
2万
查看次数

WPF TextBox在Window窗体中的ElementHost中不接受输入

我们正在开发WPF中的UI控件,以便在现有的Windows Forms/MFC应用程序引擎(Rhino 3D)中使用.

应用程序引擎公开了创建"Dockbar"的能力,它实际上允许您将Windows窗体控件放在可以停靠到Engines接口的子窗口中.

我试图将一个简单的WPF TextBox放在一个ElementHost控件中,该控件被添加到Dockbar中.乍一看似乎工作得很好; 但在尝试输入TextBox后,只有某些序列实际显示在TextBox中.该DELETE,BACKSPACE,COPY,PASTE,并选择文本的工作.如果您键入AZ,1-9等,则这些键不会显示.

我有SCOURED网,并听说过,ElementHost.EnableModelessKeyboardInterop()但这仅适用于从表单创建的WPF Windows.我只创建WPF UserControls并在ElementHost控件中托管它们.

我看到一篇关于Dispatcher.Run()的帖子,它有点工作但是打破了表单的其余部分:

System.Windows.Threading.Dispatcher.Run();
Run Code Online (Sandbox Code Playgroud)

PreviewKeyUp,PreviewKeyDown,KEYUP的KeyDown事件的所有火上的文本框,但很可惜没有文字在文本框中显示出来.

我对Windows消息了解不多,但是使用WinSpector我注意到没有WM_GETTEXT消息来自TextBox(如果它们甚至应该是我不知道的话).

我还创建了一个新的Windows窗体项目,并在那里做了同样的事情,它工作正常,所以它必须是如何在Rhino 3D引擎中创建和停靠窗口的问题.

以下是不起作用的示例代码:

ElementHost el = new ElementHost();
System.Windows.Controls.TextBox t = new System.Windows.Controls.TextBox();
t.Width = 100;
t.Text = "TEST";
el.Child = t;
panel1.Controls.Add(el);
Run Code Online (Sandbox Code Playgroud)

wpf interop textbox elementhost

20
推荐指数
4
解决办法
1万
查看次数

ElementHost中的Application.Current为null

我在我的个人Libs中使用WPF UserControl.Libs包含在我的WPF和WindowsForms程序中.现在我的UserControl必须显示一个新的(WPF)窗口.在新窗口我想设置所有者.我是这样做的:

dialog.Owner = Application.Current.MainWindow;
Run Code Online (Sandbox Code Playgroud)

如果我在WPF程序中使用UserControl,这可以正常工作.

当我在我的WindowsForms程序中使用UserControl时(我在ElementHost中设置UserControl elementHost.Child = ...)为Application.Currentnull.

这不好,我的程序抛出异常.

为什么是Application.Currentnull?

windows user-controls elementhost winforms

16
推荐指数
1
解决办法
7853
查看次数

使用ElementHost中的WPF控件呈现问题

我有一个WinForms控件,里面我有一个TableLayoutPanel包含多个ElementHosts,每个ElementHost包含一个WPF控件.

一切都很好,除非控件的大小比窗口大,并且ScrollBar在那里; 当我向下滚动时,控件变得扭曲,就像这样 -

在此输入图像描述

在最大化窗口或重新调整窗口大小时,控件可以正确渲染(减小控件的大小,使控件离开可见区域,然后再次增大大小以使其返回可见区域)

在WPF窗口的同一窗口中,WinForms控件不会发生这种情况; 知道为什么会这样,有什么解决方案吗?

.net c# wpf elementhost winforms

13
推荐指数
1
解决办法
4656
查看次数

文本在WPF窗口和ElementHost内部呈现不同

我使用WPF互操作性来在WinForms表单中托管WPF用户控件.一切正常,除了丑陋的文字渲染:

    <Label Content="Normal text" Name="labelNormal"/>
    <Label Content="Bold text" Name="labelBold" FontWeight="Bold" />
Run Code Online (Sandbox Code Playgroud)

- 这是WPF窗口上的简单标签:
WPF窗口http://img525.imageshack.us/img525/7049/wpfwindow.png

- 以及在WinForms中托管WPF用户控件时显示的相同标签:
WPF Interop http://i51.tinypic.com/14j4xnc.jpg

Interop变体是完全不同的:intercharacter间隔为零,文本看起来更纯粹的WPF变体.当普通文本可以接受时,粗体文本很难看.

有什么想法如何修复它?

先感谢您!

wpf elementhost

12
推荐指数
1
解决办法
4955
查看次数

从WinForms托管的WPF控件加载/使用资源字典

我有一个Windows窗体应用程序需要在运行时托管WPF控件.我有基本的托管和交互完成(使用ElementHost控件),一切正常,直到我尝试做一些需要WPF控件来使用定义的一些自定义资源字典.(WPF控件及其所有资源字典都在同一个WPF控件库DLL中定义.)

一旦发生这种情况,我就会收到一堆看起来像这样的错误:

System.Windows.ResourceDictionary Warning: 9 : Resource not found; ResourceKey='DocumentHeaderInterestStyle'
Run Code Online (Sandbox Code Playgroud)

我找到了一个引用(链接因归档而显示为死, 可能与最初引用的文章相同).谈到这一点,但似乎文章正在接近WPF方面的内容,但我真的不想对WPF控件进行更改,因为一切都在独立的WPF应用程序中运行.

如果实现这一目标的唯一方法是在WPF端进行更改,我可以进行这些更改(我不负责WPF控件库,但是那个也适用于同一家公司的人,所以这不是其他问题而不是花时间去做这些改变.)但是我希望能在WinForms方面做些什么才能让它发挥作用.

WPF控件库在项目中定义了一个名为"Default.xaml"的资源字典文件,其中包含以下属性:

构建操作:页面复制到输出目录:不要复制自定义工具:MSBuild:编译

独立的WPF应用程序在其App.xaml文件中包含以下条目:

    <ResourceDictionary x:Uid="ResourceDictionary_1">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary x:Uid="ResourceDictionary_2" Source="/SmartClient.Infrastructure;component/Themes\Default.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

似乎控制库应该已经知道如何获取其资源.使用Resources.MergedDictionaries.Add()似乎它应该工作,但我在哪里获得现有字典的实例?

wpf resources interop elementhost winforms

11
推荐指数
1
解决办法
7177
查看次数

WPF控件不在WinForms应用程序中的ElementHost中显示

我有一个WPF控件的问题,我试图在WinForms应用程序中的ElementHost中托管.该控件是一个无形的自定义控件,我最初是在一个单独的测试项目中开发的,它是一个WPF应用程序.在那里它显然工作正常,但在我的WinForms应用程序中,我得到的是一个空白的灰色框,其中显示ElementHost.

这是我用于创建,填充和添加ElementHost到父Control的C#代码:

// This is my WPF control
m_TabHostPanel  = new TabHostPanel();
m_ElementHost  = new ElementHost
                 {
                     Child = m_TabHostPanel,
                     Dock = DockStyle.Top,
                     Height = 34
                 };
this.Controls.Add( m_ElementHost );
Run Code Online (Sandbox Code Playgroud)

父控件包含在运行时根据需要添加和删除的其他WinForms控件.这些都是单独托管,其Dock设置为DockStyle.Fill.因此,每次添加一个时,我都会将ElementHost发送到Z-order的后面,以确保它正确呈现:

m_ElementHost.SendToBack();
Run Code Online (Sandbox Code Playgroud)

因此,我知道我没有遇到空域问题,或类似的问题.

我想知道的一件事是这样的:在原始项目中,我所有无外观控件的样式被合并到App.xaml中的应用程序的资源字典中,如下所示:

<Application x:Class="WpfTestApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Application/UserInterface/DataTemplates/TabModelDataTemplate.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/HoverablePressableButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/MiniControlButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabCloseButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabScrollLeftButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabScrollRightButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabListDropDownButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabHostComboBoxStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabButtonStyle.xaml"/>
                <ResourceDictionary Source="Application/UserInterface/Styles/TabHostPanelStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)

我已将App.xaml迁移到我的WinForms项目,但构建操作设置为Page.如果我将它设置为ApplicationDefinition,我得到一个错误,说应用程序有多个入口点,这是有道理的,但我想知道是否正在拾取样式等.如果不是这可能解释为什么我得到一个空白的灰色矩形,我的控制应该是因为没有这些,没有什么可以定义它的外观.所以也许问题是,我如何将这些样式放入我的WinForms应用程序中,以便我的WPF控件可以看到它们?

我可能还应该提到这是在.NET Fx 3.5上运行的.

无论如何,现在我很困惑,所以任何帮助都会感激不尽.

非常感谢!

巴特

.net wpf xaml elementhost winforms

10
推荐指数
1
解决办法
9032
查看次数

ElementHost大小导致wpf打开/加载速度慢,内存使用率高

问题:

我们有一个Winforms应用程序,可以打开另一个WPF窗口.此窗口包含各种图标和文本,并不过分复杂.回到主窗口,winforms one,这也有一个使用ElementHost嵌入的WPF控件(ElementHost专门设计用于使Winforms能够托管WPF控件).但是,我们注意到,一旦此应用程序的内存使用率非常高,第二个WPF窗口可能需要相当长的时间才能打开.

我们在VS2012中做了一个小型测试应用程序,可以复制问题.测试应用程序打开一个Winforms窗口,其中有两个按钮; "添加4GB内存使用"和"打开WPF窗口".WPF窗口上有一个小图标(48*48),就是这样.当我们添加4Gb内存使用并尝试第一次打开窗口时,打开窗口大约需要7秒钟.

代码:我已经通过BitBucket公开了测试应用程序和源代码.

我们发现的事情:

  • 该应用程序肯定以64位运行,因为它将以32位方式抛出OutOfMemoryExceptions.
  • 没有内存使用,窗口立即打开.
  • 使用内存时,窗口第一次打开时速度很慢.
  • 如果WPF窗口没有图像,则会立即打开.
  • 减小winforms控件上的elementhost的大小,比如1*1,窗口立即打开.显然这不是一个很好的解决方案,因为它没有显示这么大的WPF控件.
  • 我们的应用程序中的ElementHost大小约为1000*700,但是我们注意到在减少ElementHost大小时有一个很大的下降点,所以需要10秒,直到它达到350*350左右,此时突然改善再快.这可能取决于计算机,也可能是某种限制.
  • 从wpf窗口中删除图像将使其再次快速.
  • 添加新图像作为资源,并在WPF窗口上,线性地减慢打开时间(例如,1图像= 7秒,2图像= 14秒).
  • 通过确保图像与显示的大小相同来进行实验,因此不应该调整大小,但这似乎没有任何区别.
  • 用不同的图像类型进行实验,.png,.tiff,.ico但它们似乎都很慢.

有没有其他人遇到过这个问题/有关我们下一步可能是什么的任何建议?

.net c# wpf elementhost winforms

9
推荐指数
1
解决办法
1734
查看次数

自动调整ElementHost的内容

我有一个小的WPF控件,其TextBlock的TextWrapping设置为Wrap.我试图在现有的WinForms应用程序中托管它.我将ElementHost停靠在表单的顶部,我想根据TextBlock所需的高度调整ElementHost的高度.有没有办法实现这个目标?

wpf elementhost winforms

7
推荐指数
1
解决办法
4972
查看次数