You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Form集成WPF自定义温度表盘控件报默认构造函数错误求助

错误核心原因

  1. 构造函数语法错误:VB.NET 中类的构造函数固定为 Sub New(),你写的 Public Sub Temperature_Dial() 只是普通方法,不是构造函数,导致类没有可识别的无参默认构造函数,触发报错。
  2. 继承类型错误:WPF 用户控件需要继承 System.Windows.Controls.UserControl,你错误继承了 WinForm 版的 System.Windows.Forms.UserControl,类型不匹配。
  3. 逻辑覆盖错误:你手动实现了空的 InitializeComponent() 方法,覆盖了 XAML 自动生成的控件初始化逻辑,导致 XAML 中定义的界面元素无法正常加载。
  4. 命名空间不匹配:XAML 中 x:Class="Temperature_Dial" 没有带上命名空间,和 VB 代码中 CSV_FILE 命名空间下的类无法对应。
  5. 重复声明成员:你手动声明了 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:24:05