Tag: wpf

WPF – 将Bitmap转换为ImageSource

我需要将System.Drawing.Bitmap转换为System.Windows.Media.ImageSource类,以便将其绑定到WizardPage(扩展WPF工具包)的HeaderImage控件中。 位图设置为我编写的程序集的资源。 它被引用如下: public Bitmap GetBitmap { get { Bitmap bitmap = new Bitmap(Resources.my_banner); return bitmap; } } public ImageSource HeaderBitmap { get { ImageSourceConverter c = new ImageSourceConverter(); return (ImageSource) c.ConvertFrom(GetBitmap); } } 这个转换器是我在这里找到的: http : //www.codeproject.com/Questions/621920/How-to-convert-Bitmap-to-ImageSource我得到一个NullReferenceException return (ImageSource) c.ConvertFrom(Resources.my_banner); 如何初始化ImageSource以避免此exception? 或者还有另一种方式吗? 我希望之后使用它: <xctk:WizardPage x:Name="StartPage" Height="500" Width="700" HeaderImage="{Binding HeaderBitmap}" Enter="StartPage_OnEnter" 提前感谢您的任何答案。

将JPEG图像转换为字节数组 – COMexception

使用C#,我正在尝试从磁盘加载JPEG文件并将其转换为字节数组。 到目前为止,我有这个代码: static void Main(string[] args) { System.Windows.Media.Imaging.BitmapFrame bitmapFrame; using (var fs = new System.IO.FileStream(@”C:\Lenna.jpg”, FileMode.Open)) { bitmapFrame = BitmapFrame.Create(fs); } System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.JpegBitmapEncoder(); encoder.Frames.Add(bitmapFrame); byte[] myBytes; using (var memoryStream = new System.IO.MemoryStream()) { encoder.Save(memoryStream); // Line ARGH // mission accomplished if myBytes is populated myBytes = memoryStream.ToArray(); } } 但是,执行ARGH行给我的信息是: COMException未处理。 句柄无效。 […]

自定义自动resize的WPF Panel类

我正在尝试通过覆盖MeasureOverride和ArrangeOverride为WPF编写自定义Panel类,但是,虽然它主要工作,但我遇到了一个我无法解释的奇怪问题。 特别是,在确定了他们的尺寸应该是什么之后,我在ArrangeOverride调用我的子项目时,它们的大小不是我给它们的大小,并且看起来是在尺寸上调整到尺寸传递到MeasureOverride的Measure方法。 我错过了这个系统应该如何工作的东西吗? 我的理解是,调用Measure只会让孩子根据提供的availableSize评估其DesiredSize ,并且不应该影响它的实际最终大小。 这是我的完整代码(面板,顺便说一句,旨在以最节省空间的方式安排孩子,为不需要它的行提供更少的空间,并在其余部分之间平均分配剩余空间 – 它目前仅支持垂直方向,但我打算一旦我正常工作就加水平): 编辑:感谢您的回复。 我马上就会仔细研究它们。 但是,让我澄清我的预期算法是如何工作的,因为我没有解释。 首先,想到我正在做的最好的方法是想象一个Grid,每行设置为*。 这样可以均匀地划分空间。 但是,在某些情况下,行中的元素可能不需要所有空间; 如果是这种情况,我想占用任何剩余空间并将其分配给可以使用该空间的那些行。 如果没有行需要任何额外的空间,我只是尝试均匀地extraSpace事物(这就是extraSpace正在做的事情,它只适用于那种情况)。 我这两次通过。 第一遍的最终点是确定行的最终“正常大小” – 即将缩小的行的大小(给定小于其所需大小的大小)。 我这样做是通过将最小项目逐步调整到最大值并在每一步调整计算出的正常大小,方法是将每个小项目的剩余空间添加到每个后续较大项目,直到没有更多项目“适合”然后中断。 在下一个过程中,我使用此正常值来确定项目是否适合,只需将正常大小的Min与项目所需的大小相对应即可。 (为简单起见,我还将匿名方法更改为lambda函数。) 编辑2:我的算法似乎在确定孩子的正确大小方面非常有用。 然而,孩子们只是不接受他们给定的尺寸。 我通过传递PositiveInfinity并返回Size(0,0)来尝试Goblin建议的MeasureOverride ,但是这会让孩子们自己绘制,好像根本没有空间限制。 对此不明显的部分是由于调用Measure发生的事情。 微软关于这个主题的文档并不清楚,因为我已多次阅读每个类和属性描述。 但是,现在很清楚调用Measure实际上会影响孩子的渲染,因此我将尝试将这些逻辑分解为BladeWise建议的两个函数。 解决了!! 我搞定了。 正如我所怀疑的,我需要对每个孩子调用两次Measure()(一次评估DesiredSize,另一次评估每个孩子的正确身高)。 我似乎很奇怪,WPF中的布局会以如此奇怪的方式设计,它会分成两个通道,但是测量通道实际上做了两件事:测量和大小的子项和编程通道几乎没有任何实际的物理定位孩子们。 非常离奇。 我将在底部发布工作代码。 首先,原始(破碎)代码: protected override Size MeasureOverride( Size availableSize ) { foreach ( UIElement child in Children ) child.Measure( availableSize ); […]

为什么WPF中的依赖项属性必须是静态的

为什么依赖属性必须是静态的? 我已经看到它已经在这里的一些post中被问过,但我无法正确理解它。 如果有人能用小片段帮助我理解,那将是很棒的。

WPF /multithreading:MVVM中的UI调度程序

所以说在MVVM环境中,我在后台线程中,我想在ui控件上运行更新。 所以通常我会去myButton.Dispatcher.BeginInvoke(blabla),但是我无法访问myButton(因为viewmodel无法访问视图的控件)。 那么这样做的正常模式是什么? (我想总是有约束力,但我想通过调度员知道如何做到这一点)

将字典绑定到WPF ListBox

给定的dictionary.Values ,你如何绑定dictionary.Values到WPF ListBox,以便项目使用.Name属性? struct Drink { public string Name { get; private set; } public int Popularity { get; private set; } public Drink ( string name, int popularity ) : this ( ) { this.Name = name; this.Popularity = popularity; } }

将大型MFC应用程序迁移到WPF / .NET有哪些技巧?

我目前正在开发一个非常大的传统MFC MDI应用程序。 它有大量的UI元素 – 可停靠的工具栏,自定义树控件,上下文菜单等。它是一个图像处理应用程序,因此主视图使用DirectX和OpenGL自我渲染。 该产品大约有10年的历史,其中一个优先事项是更新它的外观和感觉。 知道微软在提供C ++ / MFC和.NET之间的互操作性方面做得很好,我认为以递增方式迁移代码库是有意义的。 我现在正在努力的是从哪里开始。 一种方法是使用WPF删除MFC框架并尽可能多地重用C ++代码。 这将让我们最大限度地发挥WPF架构的优势,但这将意味着一个漫长的开发阶段,直到我们再次完全正常运行。 另一种方法是用它们的WPF对应物一次替换一个MFC控件。 这将允许我们以增量方式工作。 我对这种方法的关注是,这意味着托管和非托管代码之间会有很多连接点,我不知道从哪里开始替换主菜单和工具栏等内容。 或者我还有其他选择吗? 任何有关此主题的信息的建议或链接将不胜感激。 更新: DavidK提出了一些很好的问题,所以我添加了这背后的动机。 1)产品的未来发展 该产品仍在积极开发中,并定期添加新function。 我认为尝试慢慢迁移到C#/ WPF会很有意义。 在我使用C#/ WPF的有限经验中,我发现在C ++ / MFC中工作效率会提高。 我们用WPF获得的另一件大事就是能够利用多头系统。 MFC应用程序仅限于单个顶级框架,因此很难利用多个监视器。 2)员工保留和招聘 找到愿意使用MFC的开发人员越来越难了。 对于当前开发人员的职业发展而言,接触新技术也很重要。

如何在文本框中显示气球提示?

我有一个使用XAML和MVVM的C#WPF应用程序。 我的问题是:如何在文本框上方显示用户输入的某些无效数据的气球工具提示? 我想使用Microsoft的本机气球控件 。 我如何将其实现到我的应用程序中?

WPF复选框检查IsChecked

我不是在谈论一个事件处理程序,而是一个简单的If Statement检查CheckBox是否已被选中。 到目前为止我有: if (chkRevLoop.IsChecked == true){} 但这引发了错误: 无法隐式转换类型’bool?’ ‘bool’。 存在显式转换(您是否错过了演员?) 有没有办法做到这一点,我错过了?

带有UserControls的WPF Caliburn.Micro和TabControl问题

我很确定这已经在某处得到了解答,但我似乎无法在我的生活中找到它。 我正在尝试使用TabControl在UserControls之间切换(每个选项卡都不同,因此不使用Items) 这是细分:我有我的主视图和3个用户控件。 Mainview有一个选项卡控件 – 每个选项卡应显示不同的用户控件。 我可以很容易地将tabcontrol对象设置为usercontrol但是它没有绑定到viewmodel,只绑定了视图。 所以我在我的VM和ActivateItem中使用Conductor。 这是它开始变得奇怪/令人沮丧的地方。 应用程序从选中Tab0开始,但Tab2(最后一个选项卡)内容。 单击任何其他选项卡,为该选项卡加载正确的ViewModel。 单击返回Tab0,同时加载正确的内容。 我如何让它停下来? 另外,如果切换标签没有再次重新初始化视图模型,清除已经输入的字段,我真的很喜欢它。 无论如何,这是我的一些来源,我将在这里放弃它并在我打破鼠标之前处理其他事情。 视图: 和ViewModel: class MainViewModel : Conductor { RemoteInfoViewModel remoteInfo = new RemoteInfoViewModel(); RemoteToolsViewModel remoteTools = new RemoteToolsViewModel(); CHRemoteViewModel chRemote = new CHRemoteViewModel(); public MainViewModel() { ActivateItem(remoteInfo); } public void LoadRemoteInfo() { ActivateItem(remoteInfo); } public void LoadRemoteTools() { ActivateItem(remoteTools); } public […]