WPF開發(fā)者QQ群:?340500857? | 微信群 -> 進入公眾號主頁?加入組織
?
? ? ?由于在WPF中沒有現(xiàn)成的數據拾取器控件,所以我們自己實現(xiàn)一個。
PS:有更好的方式歡迎推薦。
01
—
代碼如下
一、創(chuàng)建?RoundPicker.cs 繼承?Control代碼如下。
RoundPicker.cs實現(xiàn)思路如下
1、基于Canvas繪制Button或者其他控件?。
2、已知圓的半徑嵌套使用for循環(huán),然后進行添加控件如下。
?var value =? x * x + y * y;
?double rIn = radius - thickness, rOut = radius + thickness;
?if (value >= rIn * rIn && value <= rOut * rOut)
{
? ? ?//此處進行Add的話就是在圓四周繪制控件。
? ? ?//效果如下
}
?如果需要內部也能追加上控件需要增加邏輯如下。
?else if (value < rIn * rIn && value < rOut * rOut)
?{
? ? //效果如下
}
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;namespace WPFDevelopers.Controls
{public class RoundPicker : Control{private Canvas _canvas;private char[] _singleLastName = new char[444] {'趙', '錢', '孫', '李', '周', '吳', '鄭', '王', '馮', '陳','褚', '衛(wèi)', '蔣', '沈', '韓', '楊', '朱', '秦', '尤', '許','何', '呂', '施', '張', '孔', '曹', '嚴', '華', '金', '魏','陶', '姜', '戚', '謝', '鄒', '喻', '柏', '水', '竇', '章','云', '蘇', '潘', '葛', '奚', '范', '彭', '郎', '魯', '韋','昌', '馬', '苗', '鳳', '花', '方', '俞', '任', '袁', '柳','酆', '鮑', '史', '唐', '費', '廉', '岑', '薛', '雷', '賀','倪', '湯', '滕', '殷', '羅', '畢', '郝', '鄔', '安', '常','樂', '于', '時', '傅', '皮', '卞', '齊', '康', '伍', '余','元', '卜', '顧', '孟', '平', '黃', '和', '穆', '蕭', '尹','姚', '邵', '湛', '汪', '祁', '毛', '禹', '狄', '米', '貝','明', '臧', '計', '伏', '成', '戴', '談', '宋', '茅', '龐','熊', '紀', '舒', '屈', '項', '祝', '董', '梁', '杜', '阮','藍', '閔', '席', '季', '麻', '強', '賈', '路', '婁', '危','江', '童', '顏', '郭', '梅', '盛', '林', '刁', '鐘', '徐','邱', '駱', '高', '夏', '蔡', '田', '樊', '胡', '凌', '霍','虞', '萬', '支', '柯', '昝', '管', '盧', '莫', '經', '房','裘', '繆', '干', '解', '應', '宗', '丁', '宣', '賁', '鄧','郁', '單', '杭', '洪', '包', '諸', '左', '石', '崔', '吉','鈕', '龔', '程', '嵇', '邢', '滑', '裴', '陸', '榮', '翁','荀', '羊', '於', '惠', '甄', '麴', '家', '封', '芮', '羿','儲', '靳', '汲', '邴', '糜', '松', '井', '段', '富', '巫','烏', '焦', '巴', '弓', '牧', '隗', '山', '谷', '車', '侯','宓', '蓬', '全', '郗', '班', '仰', '秋', '仲', '伊', '宮','寧', '仇', '欒', '暴', '甘', '鈄', '厲', '戎', '祖', '武','符', '劉', '景', '詹', '束', '龍', '葉', '幸', '司', '韶','郜', '黎', '薊', '薄', '印', '宿', '白', '懷', '蒲', '邰','從', '鄂', '索', '咸', '籍', '賴', '卓', '藺', '屠', '蒙','池', '喬', '陰', '郁', '胥', '能', '蒼', '雙', '聞', '莘','黨', '翟', '譚', '貢', '勞', '逄', '姬', '申', '扶', '堵','冉', '宰', '酈', '雍', '舄', '璩', '桑', '桂', '濮', '牛','壽', '通', '邊', '扈', '燕', '冀', '郟', '浦', '尚', '農','溫', '別', '莊', '晏', '柴', '瞿', '閻', '充', '慕', '連','茹', '習', '宦', '艾', '魚', '容', '向', '古', '易', '慎','戈', '廖', '庾', '終', '暨', '居', '衡', '步', '都', '耿','滿', '弘', '匡', '國', '文', '寇', '廣', '祿', '闕', '東','歐', '殳', '沃', '利', '蔚', '越', '夔', '隆', '師', '鞏','厙', '聶', '晁', '勾', '敖', '融', '冷', '訾', '辛', '闞','那', '簡', '饒', '空', '曾', '毋', '沙', '乜', '養(yǎng)', '鞠','須', '豐', '巢', '關', '蒯', '相', '查', '後', '荊', '紅','游', '竺', '權', '逯', '蓋', '益', '桓', '公', '仉', '督','晉', '楚', '閆', '法', '汝', '鄢', '涂', '欽', '歸', '海','岳', '帥', '緱', '亢', '況', '后', '有', '琴', '商', '牟','佘', '佴', '伯', '賞', '墨', '哈', '譙', '笪', '年', '愛','陽', '佟', '言', '福'};private Random _random = new Random();private int _rdnumber;public string SelectItem{get { return (string)GetValue(SelectItemProperty); }set { SetValue(SelectItemProperty, value); }}public static readonly DependencyProperty SelectItemProperty =DependencyProperty.Register("SelectItem", typeof(string), typeof(RoundPicker), new PropertyMetadata("閆"));static RoundPicker(){DefaultStyleKeyProperty.OverrideMetadata(typeof(RoundPicker), new FrameworkPropertyMetadata(typeof(RoundPicker)));}public override void OnApplyTemplate(){base.OnApplyTemplate();_canvas = GetTemplateChild("PART_Canvas") as Canvas;if (_canvas == null) return;}int zIndex = 0, count = 0;public RoundPicker(){this.Loaded += (s, e) =>{if (_canvas == null) return;double radius = 5;double thickness = 0.4;double rIn = radius - thickness, rOut = radius + thickness;double left = 10d, top = 10d;var brushConverter = new BrushConverter();var ellipse = new Ellipse{Stroke = (Brush)brushConverter.ConvertFromString("#F56C6C"),StrokeThickness = 2,SnapsToDevicePixels = true,UseLayoutRounding = true,Fill = (Brush)brushConverter.ConvertFromString("#F2F6FC"),};_canvas.Children.Add(ellipse);for (double y = radius; y >= -radius; --y){for (double x = -radius; x < rOut; x += 1){_rdnumber = _random.Next(444);var button = new Button{Width = 20,Height = 20,Cursor = Cursors.Hand,Content= _singleLastName[_rdnumber],UseLayoutRounding = true,Padding = new Thickness(0),Style = (Style)this.FindResource("PrimaryButton")};button.RenderTransformOrigin = new Point(.5, .5);button.RenderTransform = new ScaleTransform();button.MouseMove += (sender, ex) =>{var btn = sender as Button;Panel.SetZIndex(btn, 1);var doubleAnimation = new DoubleAnimation {To = 2,Duration = TimeSpan.FromMilliseconds(100),};var scaleTransform = btn.RenderTransform as ScaleTransform;scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, doubleAnimation);scaleTransform.BeginAnimation(ScaleTransform.ScaleYProperty, doubleAnimation);};button.MouseLeave += (sender, ex) =>{var btn = sender as Button;var scaleTransform = btn.RenderTransform as ScaleTransform;var doubleAnimation = new DoubleAnimation{To = 1,Duration = TimeSpan.FromMilliseconds(100)};scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, doubleAnimation);scaleTransform.BeginAnimation(ScaleTransform.ScaleYProperty, doubleAnimation);Panel.SetZIndex(btn, 0);};button.Click += (sender, ex) => {var btn = sender as Button;SelectItem = btn.Content.ToString();};double value = x * x + y * y;if (value >= rIn * rIn && value <= rOut * rOut){_canvas.Children.Add(button);Canvas.SetTop(button, top);Canvas.SetLeft(button, left);}else if (value < rIn * rIn && value < rOut * rOut){_canvas.Children.Add(button);Canvas.SetTop(button, top);Canvas.SetLeft(button, left);}left = left + button.Width + 1;}left = 10d;top = top + 21;}ellipse.Width = top + 9;ellipse.Height = top + 9;//Panel.SetZIndex(ellipse, 0);//count = _canvas.Children.Count + 1;};}}
}
二、創(chuàng)建RoundPicker.xaml代碼如下
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:controls="clr-namespace:WPFDevelopers.Controls"><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Basic/ControlBasic.xaml"/></ResourceDictionary.MergedDictionaries><Style TargetType="{x:Type controls:RoundPicker}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:RoundPicker}"><Canvas x:Name="PART_Canvas"></Canvas></ControlTemplate></Setter.Value></Setter>
</Style></ResourceDictionary>
三、創(chuàng)建RoundPickerExample.xaml代碼如下
<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.RoundPickerExample"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:WPFDevelopers.Samples.ExampleViews"xmlns:wpfdev="https://github.com/yanjinhuagood/WPFDevelopers"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid><UniformGrid><wpfdev:RoundPicker Margin="100" x:Name="RoundPicker"/><TextBlock Text="{Binding ElementName=RoundPicker,Path=SelectItem}"FontSize="120" FontFamily="仿宋"VerticalAlignment="Center"Margin="0,120,0,0"/></UniformGrid></Grid>
</UserControl>
02
—
效果預覽
鳴謝支持者 - 王菅物
源碼地址如下
github:https://github.com/yanjinhuagood/WPFDevelopers.git
gitee:https://gitee.com/yanjinhua/WPFDevelopers.git
WPF開發(fā)者QQ群:?340500857?
blogs:?https://www.cnblogs.com/yanjinhua
Github:https://github.com/yanjinhuagood
出處:https://www.cnblogs.com/yanjinhua
版權:本作品采用「署名-非商業(yè)性使用-相同方式共享 4.0 國際」許可協(xié)議進行許可。
轉載請著名作者 出處 https://github.com/yanjinhuagood
掃一掃關注我們,
更多知識早知道!
點擊閱讀原文可跳轉至源代碼
總結
以上是生活随笔為你收集整理的WPF实现数据拾取器的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。