找回密码
 立即注册

QQ登录

只需一步,快速开始

WPF_guy

论坛元老

6

主题

23

帖子

9326

积分

论坛元老

积分
9326

活字格认证微信认证勋章元老葡萄

WPF_guy
论坛元老   /  发表于:2013-4-19 10:43  /   查看:6722  /  回复:6
1、对于C1Gauge中的问题,比如C1RadialGauge,不知道如何自定义指针的形状,

2、官方示例中的C1Knob中的天气预报DEMO中的指针式如何实现的呢?在代码里看不出来啊

(上述两个问题其实是一样的:如何自定义C1Gauge控件的指针(Pointer)形状呢?)

6 个回复

倒序浏览
WPF_guy
论坛元老   /  发表于:2013-4-19 17:01:00
沙发
自己回答:已经找到解决的方法,只需要为Pointer设计一个ControlTemplate 就行了哈~~
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-19 17:15:00
板凳
请参考以下代码:
  1. <c1:C1RadialGauge Height="226" Margin="22,24,0,12" Name="C1RadialGauge1" Width="256" PointerFill="SkyBlue" PointerCapStroke="CornflowerBlue" PointerStroke="CornflowerBlue" >

  2.     <c1:C1RadialGauge.PointerCapFill>

  3.         <RadialGradientBrush>

  4.             <GradientStop Color="CornflowerBlue" Offset="0"/>

  5.             <GradientStop Color="SkyBlue" Offset="1"/>

  6.         </RadialGradientBrush>

  7.     </c1:C1RadialGauge.PointerCapFill>

  8. </c1:C1RadialGauge>
复制代码
回复 使用道具 举报
WPF_guy
论坛元老   /  发表于:2013-4-20 09:22:00
地板
回复 3楼dof的帖子

谢谢斑竹~~!!我找到了一个解决的例子,在官方DEMO中的RuleUserControl.xaml里有一段代码:
        <Style x:Key="ointer" TargetType="c1:C1LinearGaugePointer">
            <Style.Setters>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="c1:C1LinearGaugePointer">
                            <ath x:Name="Root" Stretch="Fill"
                                  Stroke="{TemplateBinding BorderBrush}"
                                  Fill="{TemplateBinding Background}"
                                  StrokeThickness="{TemplateBinding Thickness}"
                                  Data="M1,3 C1,1.8954304 1.8954304,1 3,1 L11,1 C12.104569,1 13,1.8954304 13,3 C13,3 8.5457163,13 7.4411469,13 L7.4514785,89.679596 L6.5580759,89.667915 L6.5588531,13 C5.4542832,13 1,3 1,3 z" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
        </Style>

考照这个,就可以做出任意形状的Pointer了哈~~
回复 使用道具 举报
WPF_guy
论坛元老   /  发表于:2013-4-20 13:44:00
5#
回复 3楼dof的帖子

亲爱的版主,我还有个问题:如何让Gauge的指针随着用户的数据动起来呢?我看DEMO里的例子都是静态的。

我现在的思路是把Gauge的Value属性与用户数据类的一个属性Binding起来,但是不能成功。请您帮我看看啦~~:

C# Code:
//前面的using  省略。
namespace Gauge3
{
    public partial class UserControl1 : UserControl
    {
        DispatcherTimer dt;
        Random rnd= new Random();
        public Data data1=new Data();  //实例化一个用户自定义类Data
        public UserControl1()
        {  
            InitializeComponent();

            Binding binding = new Binding();
            //设置源对象
            binding.Source = data1;
            //设置源属性
            binding.Path = new PropertyPath(&quot;DATA&quot;);
            //添加到目标属性
            this.c1RadialGauge1.SetBinding(C1RadialGauge.ValueProperty, binding);
            //添加一个定时器,每秒产生一个数据
            dt = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };
            dt.Tick += (s, e) =&gt; getData();
            dt.Start();        
        }

        public void  getData()
        {       //产生的数据存入Data类的data1实例中
            double  r= 10*rnd.NextDouble();
            data1.DATA = r;  
        }
    }

    public class Data
    {
        public double data;
        public double DATA
        {
            get{ return data; }
            set { data = value;  }
        }
    }
}
(另外,对应的XAML中没有写任何关于Binding的东西。)
运行之后没有报错,但是Gauge的指针不动。调试后,发现数据可以进入data1.DATA中,不知道是否Binding到Gauge.Value了。。。

我连这个基本的都搞不定。。555555:221 :221 :221 。。。请高手指点啦~~
回复 使用道具 举报
WPF_guy
论坛元老   /  发表于:2013-4-21 20:36:00
6#
回复 5楼WPF_guy的帖子

自己回答:
       玩了一天回来看程序,终于找到这困惑的症结之所在了:自定义的类没有加入INotifyPropertyChanged机制,因此无法实现UI随数据变化。因此,把自定义的Data类重写为如下代码即可解决(与大家分享一下,希望不要再犯我这种错误了哈~~)

把Data类重写为:

using System.ComponentModel;       //加在C#文件最开头
public class Data : INotifyPropertyChanged
    {
        private double data;
        public event PropertyChangedEventHandler PropertyChanged;

        public double DATA
        {
            get{ return data; }
            set { data = value; OnPropertyChanged(&quot;DATA&quot;); }
        }

        private void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
     }

其实是在其他的博客上查到的,其地址为:http://www.cnblogs.com/iwteih/archive/2010/02/03/1662891.html。有兴趣的筒子可以看看~~
看来还是对WPF的Binding的理解不透彻啊~~惭愧
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-22 17:16:00
7#
谢谢分享, INotifyPropertyChanged很好用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部