Windows Form集成WPF自定义温度表盘控件报默认构造函数错误求助
错误核心原因
- 构造函数语法错误:VB.NET 中类的构造函数固定为
Sub New(),你写的Public Sub Temperature_Dial()只是普通方法,不是构造函数,导致类没有可识别的无参默认构造函数,触发报错。 - 继承类型错误:WPF 用户控件需要继承
System.Windows.Controls.UserControl,你错误继承了 WinForm 版的System.Windows.Forms.UserControl,类型不匹配。 - 逻辑覆盖错误:你手动实现了空的
InitializeComponent()方法,覆盖了 XAML 自动生成的控件初始化逻辑,导致 XAML 中定义的界面元素无法正常加载。 - 命名空间不匹配:XAML 中
x:Class="Temperature_Dial"没有带上命名空间,和 VB 代码中CSV_FILE命名空间下的类无法对应。 - 重复声明成员:你手动声明了
Private arrowPointer As System.Windows.Shapes.Rectangle,该成员会由 XAML 自动生成,手动声明会导致冲突。
修正方案
1. 修正 VB 后端代码
Imports System.Windows.Controls Imports System.Windows.Media Imports System.Windows.Shapes Namespace CSV_FILE Partial Public Class Temperature_Dial Inherits System.Windows.Controls.UserControl Public pointervalue As Double ' 正确的无参默认构造函数 Public Sub New() ' 调用XAML自动生成的初始化方法,不要手动实现该方法 InitializeComponent() End Sub Public Sub changevalue() Dim rotate As RotateTransform = New RotateTransform(pointervalue) arrowPointer.RenderTransform = rotate End Sub End Class End Namespace
删除你代码中多余的 WinForm 相关引用(比如 System.Windows.Forms、System.Windows.Forms.Integration 等,这些放到 WinForm 项目中引用即可),同时删除你手动写的 InitializeComponent() 实现。
2. 修正 XAML 代码
修改 x:Class 属性,带上对应的命名空间:
<UserControl x:Class="CSV_FILE.Temperature_Dial" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:CSV_FILE" mc:Ignorable="d" Width="368.545" Height="463.273"> <!-- 其余界面代码保持不变 --> <Grid x:Name="Dial" Margin="-13,-66,0,-50" HorizontalAlignment="Left" Width="379"> <Grid.Background> <ImageBrush ImageSource="Temp_gauge_without_needles.png" Stretch="UniformToFill"/> </Grid.Background> <Rectangle x:Name="Value" HorizontalAlignment="Left" Height="197" Margin="90,144,0,0" VerticalAlignment="Top" Width="217"> <Rectangle.Fill> <ImageBrush ImageSource="dial_values.png" Stretch="UniformToFill"/> </Rectangle.Fill> </Rectangle> <Rectangle x:Name="arrowPointer" HorizontalAlignment="Left" Height="34" Margin="87,242,0,0" VerticalAlignment="Top" Width="149" RenderTransformOrigin="0.77,0.48"> <Rectangle.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="2612.226"/> <TranslateTransform X="-3.86853" Y="-0.314352"/> </TransformGroup> </Rectangle.RenderTransform> <Rectangle.Fill> <ImageBrush ImageSource="NEEDLE.png" Stretch="UniformToFill"/> </Rectangle.Fill> </Rectangle> </Grid> </UserControl>
3. WinForm 项目中使用
确保 WinForm 项目已经引用 WindowsFormsIntegration.dll、PresentationCore.dll、PresentationFramework.dll、WindowsBase.dll 以及你的 WPF 控件项目,使用代码示例:
' 初始化WPF控件 Dim wpfDial As New CSV_FILE.Temperature_Dial() ' 赋值给ElementHost的Child属性 elementHost1.Child = wpfDial ' 测试修改指针值 wpfDial.pointervalue = 90 wpfDial.changevalue()
内容的提问来源于stack exchange,提问作者Sindhu Halesh
相关产品推荐
相关产品推荐

