Browse Source

111

样式分支
fyf 2 years ago
parent
commit
5c940d1af2
4 changed files with 375 additions and 0 deletions
  1. +167
    -0
      BPASmartClient.SCADAControl/Converters/HoneycombPanel.cs
  2. +87
    -0
      BPASmartClient.SCADAControl/CustomerControls/TheWuLiaoControl.xaml
  3. +119
    -0
      BPASmartClient.SCADAControl/CustomerControls/TheWuLiaoControl.xaml.cs
  4. +2
    -0
      BPASmartClient.SCADAControl/Themes/Generic.xaml

+ 167
- 0
BPASmartClient.SCADAControl/Converters/HoneycombPanel.cs View File

@@ -0,0 +1,167 @@
using System;
using System.Windows;
using System.Windows.Controls;


namespace BPASmartClient.SCADAControl.Converters
{
public class HoneycombPanel : Panel
{
private double _unitLength;

private HoneycombStuffer _stuffer;

private static int GetXCount(int count)
{
if (count == 0) return 0;

count -= 1;

var index = (int)Math.Floor(Math.Pow((12.0 * count + 25) / 36, 0.5) - 5.0 / 6);
var valeIndex = 3 * index * index + 5 * index;
var centerValue = valeIndex + 2;

return count >= centerValue
? 4 * index + 6
: count > valeIndex
? 4 * index + 4
: 4 * index + 2;
}

private static int GetYCount(int count)
{
if (count == 0) return 0;

count -= 1;

var index = (int)Math.Floor(Math.Pow(count / 3.0 + 0.25, 0.5) - 0.5);
var valeIndex = 3 * index * index + 3 * index;

return count > valeIndex
? 2 * index + 2
: 2 * index;
}

/*
* layout order
*
* ● ●
* (7) (8)
*
* ● ● ●
* (6) (1) (9)
*
* ● ● ● ...
* (5) (0) (2)
*
* ● ● ...
* (4) (3)
*
*/
protected override Size MeasureOverride(Size availableSize)
{
var maxSize = new Size();

foreach (UIElement child in InternalChildren)
{
if (child != null)
{
child.Measure(availableSize);
maxSize.Width = Math.Max(maxSize.Width, child.DesiredSize.Width);
maxSize.Height = Math.Max(maxSize.Height, child.DesiredSize.Height);
}
}

_unitLength = Math.Max(maxSize.Width, maxSize.Height) / 2;

var xCount = GetXCount(InternalChildren.Count);
var yCount = GetYCount(InternalChildren.Count);

var availableWidth = xCount * _unitLength;
var availableHeight = yCount * Math.Pow(3, 0.5) * _unitLength + _unitLength * 2;

return new Size(availableWidth, availableHeight);
}

protected override Size ArrangeOverride(Size finalSize)
{
var childLength = _unitLength * 2;
_stuffer = new HoneycombStuffer(new Rect(finalSize.Width / 2 - _unitLength,
finalSize.Height / 2 - _unitLength, childLength, childLength));

foreach (UIElement child in InternalChildren)
{
child.Arrange(_stuffer.Move());
}

return finalSize;
}

private class HoneycombStuffer
{
private int _turns;

private int _maxIndex;

private int _currentIndex = -1;

private readonly double _offsetX;

private readonly double _offsetY;

private Rect _childBounds;

private readonly double[] _offsetXArr;

private readonly double[] _offsetYArr;

public HoneycombStuffer(Rect childBounds)
{
_childBounds = childBounds;
_offsetX = childBounds.Width / 2;
_offsetY = Math.Pow(3, 0.5) * _offsetX;

_offsetXArr = new[]
{
2 * _offsetX,
_offsetX,
-_offsetX,
-2 * _offsetX,
-_offsetX,
_offsetX
};

_offsetYArr = new[]
{
0,
_offsetY,
_offsetY,
0,
-_offsetY,
-_offsetY
};
}

public Rect Move()
{
_currentIndex++;
if (_currentIndex > _maxIndex)
{
_turns++;
_maxIndex = _turns * 6 - 1;
_currentIndex = 0;
_childBounds.Offset(_offsetX, -_offsetY);
return _childBounds;
}

if (_turns > 0)
{
var index = _currentIndex / _turns;
_childBounds.Offset(_offsetXArr[index], _offsetYArr[index]);
}

return _childBounds;
}
}
}
}

+ 87
- 0
BPASmartClient.SCADAControl/CustomerControls/TheWuLiaoControl.xaml View File

@@ -0,0 +1,87 @@
<UserControl x:Class="BPASmartClient.SCADAControl.CustomerControls.TheWuLiaoControl"
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:kj="clr-namespace:BPASmartClient.SCADAControl.Converters"
xmlns:local="clr-namespace:BPASmartClient.SCADAControl.CustomerControls"
mc:Ignorable="d"
x:Name="main"
Width="200" Height="200">
<UserControl.Resources>
<Style x:Key="ListBoxItemCustom" TargetType="ListBoxItem">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Padding" Value="0" />
<Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType=ItemsControl}}" />
<Setter Property="VerticalContentAlignment" Value="Top" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="ListBoxBaseStyle" TargetType="ListBox">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.CanContentScroll" Value="true" />
<Setter Property="ScrollViewer.PanningMode" Value="Both" />
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Padding" Value="2,2,2,0" />
</Style>
<Style x:Key="ListBoxCustom" BasedOn="{StaticResource ListBoxBaseStyle}" TargetType="ListBox">
<Setter Property="ItemContainerStyle" Value="{StaticResource ListBoxItemCustom}" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</UserControl.Resources>
<Grid>
<Ellipse Fill="Transparent" Stroke="{Binding Foreground, ElementName=main}" StrokeThickness="{Binding BorderThickness, ElementName=main}" Width="{Binding Width, ElementName=main}" Height="{Binding Width, ElementName=main}"/>
<Viewbox Width="auto" Height="auto" >
<Grid>
<ListBox Background="Transparent" Margin="30" ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl},Path=vs}" Style="{DynamicResource ListBoxCustom}" BorderThickness="0" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<kj:HoneycombPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Width="150" Height="150" Margin="10">
<Ellipse Width="140" Height="140" Fill="Transparent" Stroke="{Binding Foreground, ElementName=main}" StrokeThickness="{Binding BorderThickness, ElementName=main}"/>
<TextBlock Text="一号料仓" Margin="0,-10,0,0" Foreground="{Binding Foreground, ElementName=main}" HorizontalAlignment="Center"></TextBlock>
<Viewbox Width="auto" Height="auto">
<ListBox Background="Transparent" ItemsSource="{Binding dataModel}" Style="{DynamicResource ListBoxCustom}" BorderThickness="0" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<kj:HoneycombPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Ellipse Width="100" Height="100" Fill="Transparent" Stroke="{Binding Foreground, ElementName=main}" StrokeThickness="{Binding BorderThickness, ElementName=main}" Margin="10"/>
<TextBlock HorizontalAlignment="Center" Foreground="{Binding Foreground, ElementName=main}" VerticalAlignment="Center" FontSize="24" Text="味精"></TextBlock>
</Grid>
</DataTemplate>

</ListBox.ItemTemplate>
</ListBox>
</Viewbox>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>

</Viewbox>
</Grid>
</UserControl>

+ 119
- 0
BPASmartClient.SCADAControl/CustomerControls/TheWuLiaoControl.xaml.cs View File

@@ -0,0 +1,119 @@
using BPASmartClient.Compiler;
using BPASmartClient.DATABUS;
using BPASmartClient.MessageCommunication;
using BPASmartClient.MessageCommunication.MsgControl;
using BPASmartClient.MessageName;
using BPASmartClient.MessageName.EnumHelp;
using BPASmartClient.MessageName.发送消息Model;
using BPASmartClient.MessageName.接收消息Model;
using BPASmartClient.MessageName.接收消息Model.物料仓;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing.Design;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;


namespace BPASmartClient.SCADAControl.CustomerControls
{
/// <summary>
/// TheWuLiaoControl.xaml 的交互逻辑
/// </summary>
public partial class TheWuLiaoControl : UserControl, IExecutable, IDisposable
{
public TheWuLiaoControl()
{
InitializeComponent();
vs.Add(new shujuModel
{
name = "",
dataModel = new ObservableCollection<string> { "", "" }
});
vs.Add(new shujuModel
{
name = "",
dataModel = new ObservableCollection<string> { "", "", "", "" }
});
Width = 200;
Height = 200;
}

public string ControlType => "物料仓";
private bool isExecuteState;
public bool IsExecuteState
{
get { return isExecuteState; }
set
{
isExecuteState = value;
if (IsExecuteState)
{
IsEnabled = true;
Register();
}
}
}
public event EventHandler PropertyChange; //声明一个事件
/// <summary>
/// 数据模板
/// </summary>
private ObservableCollection<shujuModel> vs
{
get { return (ObservableCollection<shujuModel>)GetValue(vsProperty); }
set { SetValue(vsProperty, value); }
}
private static readonly DependencyProperty vsProperty =
DependencyProperty.Register("vs", typeof(ObservableCollection<shujuModel>), typeof(TheWuLiaoControl), new PropertyMetadata(new ObservableCollection<shujuModel>()));
/// <summary>
/// 数据模板
/// </summary>
private Dictionary<string, object> DataModel
{
get { return (Dictionary<string, object>)GetValue(DataModelProperty); }
set { SetValue(DataModelProperty, value); }
}
private static readonly DependencyProperty DataModelProperty =
DependencyProperty.Register("DataModel", typeof(Dictionary<string, object>), typeof(TheWuLiaoControl), new PropertyMetadata(new Dictionary<string, object>()));
public void Register()
{
Class_DataBus.GetInstance().BindingAction += BindingActionHeader;
}

public void BindingActionHeader(object sender, EventArgs e)
{
this.Dispatcher.Invoke((Action)(() =>
{
DataModel = Class_DataBus.GetInstance().Dic_RedisDataBinding;
PropertyChange?.Invoke(this, EventArgs.Empty);
}));
}
public void Dispose()
{

}

}

public class shujuModel
{
public string name { get; set; }
public ObservableCollection<string> dataModel { get; set; }
}
}

+ 2
- 0
BPASmartClient.SCADAControl/Themes/Generic.xaml View File

@@ -2293,4 +2293,6 @@
<GradientStop Offset="1" Color="#E3E3E3" />
</LinearGradientBrush>
<!--#endregion-->

</ResourceDictionary>

Loading…
Cancel
Save