命名空间中不存在自定义控件?

时间:2016-05-25 02:17:47

标签: c# .net wpf xaml namespaces

我一直对c#中的WPF绑定感兴趣,并尝试将控件绑定到鼠标位置,但在获得令人沮丧的“名称”[control]“在命名空间中不存在”clr-namespace:[namespace] ]“每当我将xaml代码粘贴到编辑器中时,我认为不值得花时间调查这个怪癖。

现在我试图简单地实现一个binded Arc drawing example from Stack Overflow并再次得到同样的错误。 (可以在那里找到短暂可运行示例的所有代码)

所以我已经梳理了所有Stack Overflow解决方案来解决这个问题(实际上看起来相当普遍),看似是零星的无法解决的变通方法和解决方案。

  1. This question
  2.   

    如果没有别的办法,请注释使用命名空间的行,重建,然后再次构建完整的项目。

         

    我也尝试重建项目,重新打开Visual Studio。没有   帮助。我终于评论了xaml,重建了项目,没有注释   xaml,它终于奏效了!奇怪的问题。

    1. This one说要将项目设置为发布模式,另一个答案是在同一个问题上说定义程序集:(xmlns:Local="clr-namespace:MusicPlayer.Controls;assembly=MusicPlayer")对我来说也不起作用。
    2. This person建议更改构建目标平台(x86 - x64)
    3. 我几乎尝试了所有这些解决方案都无济于事。 ReSharper似乎知道Arc类存在于分配给Local的命名空间中,但Visual Studio不存在。

      <Local:Arc Center="{Binding Path=PreviousMousePositionPixels}" 
               Stroke="White" 
               StrokeDashArray="4 4"
               SnapsToDevicePixels="True"
               StartAngle="0" 
               EndAngle="{Binding Path=DeltaAngle}" 
               SmallAngle="True"
               Radius="40"/>
      
      using System;
      using System.Collections.Generic;
      using System.Windows;
      using System.Windows.Documents;
      using System.Windows.Media;
      using System.Windows.Shapes;
      
      public sealed class Arc : Shape
      {
          public Point Center
          {
              get { return (Point)GetValue(CenterProperty); }
              set { SetValue(CenterProperty, value); }
          }
      
          // Using a DependencyProperty as the backing store for Center.  This enables animation, styling, binding, etc...
          public static readonly DependencyProperty CenterProperty =
              DependencyProperty.Register("Center", typeof(Point), typeof(Arc)
              , new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender));
      
      
          public double StartAngle
          {
              get { return (double)GetValue(StartAngleProperty); }
              set { SetValue(StartAngleProperty, value); }
          }
      
          // Using a DependencyProperty as the backing store for StartAngle.  This enables animation, styling, binding, etc...
          public static readonly DependencyProperty StartAngleProperty =
              DependencyProperty.Register("StartAngle", typeof(double), typeof(Arc)
              , new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));
      
          public double EndAngle
          {
              get { return (double)GetValue(EndAngleProperty); }
              set { SetValue(EndAngleProperty, value); }
          }
      
          // Using a DependencyProperty as the backing store for EndAngle.  This enables animation, styling, binding, etc...
          public static readonly DependencyProperty EndAngleProperty =
              DependencyProperty.Register("EndAngle", typeof(double), typeof(Arc)
              , new FrameworkPropertyMetadata(Math.PI/2.0, FrameworkPropertyMetadataOptions.AffectsRender));
      
          public double Radius
          {
              get { return (double)GetValue(RadiusProperty); }
              set { SetValue(RadiusProperty, value); }
          }
      
          // Using a DependencyProperty as the backing store for Radius.  This enables animation, styling, binding, etc...
          public static readonly DependencyProperty RadiusProperty =
              DependencyProperty.Register("Radius", typeof(double), typeof(Arc)
              , new FrameworkPropertyMetadata(10.0, FrameworkPropertyMetadataOptions.AffectsRender));
      
      
      
          public bool SmallAngle
          {
              get { return (bool)GetValue(SmallAngleProperty); }
              set { SetValue(SmallAngleProperty, value); }
          }
      
          // Using a DependencyProperty as the backing store for SmallAngle.  This enables animation, styling, binding, etc...
          public static readonly DependencyProperty SmallAngleProperty =
              DependencyProperty.Register("SmallAngle", typeof(bool), typeof(Arc)
              , new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
      
      
          static Arc()
          {
              DefaultStyleKeyProperty.OverrideMetadata(typeof(Arc), new FrameworkPropertyMetadata(typeof(Arc)));
          }
      
          protected override Geometry DefiningGeometry
          {
              get
              {
      
                  var a0 = StartAngle < 0 ? StartAngle + 2 * Math.PI : StartAngle;
                  var a1 = EndAngle < 0 ? EndAngle + 2 * Math.PI : EndAngle;
      
                  if (a1<a0)
                  {
                      a1 += Math.PI * 2;
                  }
      
                  SweepDirection d = SweepDirection.Counterclockwise;
                  bool large;
      
                  if (SmallAngle)
                  {
                      large = false;
                      double t = a1;
                      if ((a1-a0)>Math.PI)
                      {
                          d = SweepDirection.Counterclockwise;
                      }
                      else
                      {
                          d = SweepDirection.Clockwise;
                      }
      
      
                  }else{
                      large = (Math.Abs(a1 - a0) < Math.PI);
                  }
      
                  Point p0 = Center + new Vector(Math.Cos(a0), Math.Sin(a0)) * Radius;
                  Point p1 = Center + new Vector(Math.Cos(a1), Math.Sin(a1)) * Radius;
      
      
                  List<PathSegment> segments = new List<PathSegment>(1);
                  segments.Add(new ArcSegment(p1, new Size(Radius, Radius), 0.0, large, d, true));
      
                  List<PathFigure> figures = new List<PathFigure>(1);
                  PathFigure pf = new PathFigure(p0, segments, true);
                  pf.IsClosed = false;
                  figures.Add(pf);
      
                  Geometry g = new PathGeometry(figures, FillRule.EvenOdd, null);
                  return g;
              }
          }
      }
      

2 个答案:

答案 0 :(得分:1)

按照RobCroll的建议在命名空间内定义Arc。检查下面的代码,我已将其包含在Arc_Learning命名空间中,该命名空间在XAML中称为本地。

    <Window x:Class="Arc_Learning.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Arc_Learning"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:Arc
             Stroke="White" 
         StrokeDashArray="4 4"
         SnapsToDevicePixels="True"
         StartAngle="0" 
         EndAngle="{Binding Path=DeltaAngle}" 
         SmallAngle="True"
         Radius="40"/>
    </Grid>
</Window>

    using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Shapes;

namespace Arc_Learning
{
    public sealed class Arc : Shape
    {
        public Point Center
        {
            get { return (Point)GetValue(CenterProperty); }
            set { SetValue(CenterProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Center.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CenterProperty =
            DependencyProperty.Register("Center", typeof(Point), typeof(Arc)
            , new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender));


        public double StartAngle
        {
            get { return (double)GetValue(StartAngleProperty); }
            set { SetValue(StartAngleProperty, value); }
        }

        // Using a DependencyProperty as the backing store for StartAngle.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty StartAngleProperty =
            DependencyProperty.Register("StartAngle", typeof(double), typeof(Arc)
            , new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));

        public double EndAngle
        {
            get { return (double)GetValue(EndAngleProperty); }
            set { SetValue(EndAngleProperty, value); }
        }

        // Using a DependencyProperty as the backing store for EndAngle.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty EndAngleProperty =
            DependencyProperty.Register("EndAngle", typeof(double), typeof(Arc)
            , new FrameworkPropertyMetadata(Math.PI / 2.0, FrameworkPropertyMetadataOptions.AffectsRender));

        public double Radius
        {
            get { return (double)GetValue(RadiusProperty); }
            set { SetValue(RadiusProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Radius.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RadiusProperty =
            DependencyProperty.Register("Radius", typeof(double), typeof(Arc)
            , new FrameworkPropertyMetadata(10.0, FrameworkPropertyMetadataOptions.AffectsRender));



        public bool SmallAngle
        {
            get { return (bool)GetValue(SmallAngleProperty); }
            set { SetValue(SmallAngleProperty, value); }
        }

        // Using a DependencyProperty as the backing store for SmallAngle.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty SmallAngleProperty =
            DependencyProperty.Register("SmallAngle", typeof(bool), typeof(Arc)
            , new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));


        static Arc()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(Arc), new FrameworkPropertyMetadata(typeof(Arc)));
        }

        protected override Geometry DefiningGeometry
        {
            get
            {

                var a0 = StartAngle < 0 ? StartAngle + 2 * Math.PI : StartAngle;
                var a1 = EndAngle < 0 ? EndAngle + 2 * Math.PI : EndAngle;

                if (a1 < a0)
                {
                    a1 += Math.PI * 2;
                }

                SweepDirection d = SweepDirection.Counterclockwise;
                bool large;

                if (SmallAngle)
                {
                    large = false;
                    double t = a1;
                    if ((a1 - a0) > Math.PI)
                    {
                        d = SweepDirection.Counterclockwise;
                    }
                    else
                    {
                        d = SweepDirection.Clockwise;
                    }


                }
                else {
                    large = (Math.Abs(a1 - a0) < Math.PI);
                }

                Point p0 = Center + new Vector(Math.Cos(a0), Math.Sin(a0)) * Radius;
                Point p1 = Center + new Vector(Math.Cos(a1), Math.Sin(a1)) * Radius;


                List<PathSegment> segments = new List<PathSegment>(1);
                segments.Add(new ArcSegment(p1, new Size(Radius, Radius), 0.0, large, d, true));

                List<PathFigure> figures = new List<PathFigure>(1);
                PathFigure pf = new PathFigure(p0, segments, true);
                pf.IsClosed = false;
                figures.Add(pf);

                Geometry g = new PathGeometry(figures, FillRule.EvenOdd, null);
                return g;
            }
        }
    }
}

答案 1 :(得分:1)

尝试向您的窗口添加本地引用,如下所示:

在窗口的开始标记中添加此引用

xmlns:local="clr-namespace:CustomControlTest"

C#代码后面的代码中缺少命名空间定义

在类定义之前添加缺少的命名空间行,因此您的代码应该是这样的:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Shapes;

namespace CustomControlTest
{
    public sealed class Arc : Shape
    {
        public Point Center
        {
    get { return (Point)GetValue(CenterProperty); }
    set { SetValue(CenterProperty, value); }
}

// Using a DependencyProperty as the backing store for Center.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty CenterProperty =
    DependencyProperty.Register("Center", typeof(Point), typeof(Arc)
    , new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsRender));


public double StartAngle
{
    get { return (double)GetValue(StartAngleProperty); }
    set { SetValue(StartAngleProperty, value); }
}

// Using a DependencyProperty as the backing store for StartAngle.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty StartAngleProperty =
    DependencyProperty.Register("StartAngle", typeof(double), typeof(Arc)
    , new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));

public double EndAngle
{
    get { return (double)GetValue(EndAngleProperty); }
    set { SetValue(EndAngleProperty, value); }
}

// Using a DependencyProperty as the backing store for EndAngle.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty EndAngleProperty =
    DependencyProperty.Register("EndAngle", typeof(double), typeof(Arc)
    , new FrameworkPropertyMetadata(Math.PI/2.0, FrameworkPropertyMetadataOptions.AffectsRender));

public double Radius
{
    get { return (double)GetValue(RadiusProperty); }
    set { SetValue(RadiusProperty, value); }
}

// Using a DependencyProperty as the backing store for Radius.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty RadiusProperty =
    DependencyProperty.Register("Radius", typeof(double), typeof(Arc)
    , new FrameworkPropertyMetadata(10.0, FrameworkPropertyMetadataOptions.AffectsRender));



public bool SmallAngle
{
    get { return (bool)GetValue(SmallAngleProperty); }
    set { SetValue(SmallAngleProperty, value); }
}

// Using a DependencyProperty as the backing store for SmallAngle.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty SmallAngleProperty =
    DependencyProperty.Register("SmallAngle", typeof(bool), typeof(Arc)
    , new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));


static Arc()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(Arc), new FrameworkPropertyMetadata(typeof(Arc)));
}

protected override Geometry DefiningGeometry
{
    get
    {

        var a0 = StartAngle < 0 ? StartAngle + 2 * Math.PI : StartAngle;
        var a1 = EndAngle < 0 ? EndAngle + 2 * Math.PI : EndAngle;

        if (a1<a0)
        {
            a1 += Math.PI * 2;
        }

        SweepDirection d = SweepDirection.Counterclockwise;
        bool large;

        if (SmallAngle)
        {
            large = false;
            double t = a1;
            if ((a1-a0)>Math.PI)
            {
                d = SweepDirection.Counterclockwise;
            }
            else
            {
                d = SweepDirection.Clockwise;
            }


        }else{
            large = (Math.Abs(a1 - a0) < Math.PI);
        }

        Point p0 = Center + new Vector(Math.Cos(a0), Math.Sin(a0)) * Radius;
        Point p1 = Center + new Vector(Math.Cos(a1), Math.Sin(a1)) * Radius;


        List<PathSegment> segments = new List<PathSegment>(1);
        segments.Add(new ArcSegment(p1, new Size(Radius, Radius), 0.0, large, d, true));

        List<PathFigure> figures = new List<PathFigure>(1);
        PathFigure pf = new PathFigure(p0, segments, true);
        pf.IsClosed = false;
        figures.Add(pf);

        Geometry g = new PathGeometry(figures, FillRule.EvenOdd, null);
        return g;
    }
}
}
}  

添加此namespace CustomControlTest,然后它包含类