[随意跳过这个]
我正在建立一个程序来处理马匹,它们的主人以及主人的赛车颜色(丝绸)。此问题与UserControl
有关,称为SilksControl
,可作为JockeySilks
的视图。
为了表示丝绸,我使用以下类枚举:
public class JockeySilks
{
public BodyPatterns BodyPattern { get; set; }
public Colour BodyColour1 { get; set; }
public Colour BodyColour2 { get; set; }
public SleevePatterns SleevePattern { get; set; }
public Colour SleeveColour1 { get; set; }
public Colour SleeveColour2 { get; set; }
public CapPatterns CapPattern { get; set; }
public Colour CapColour1 { get; set; }
public Colour CapColour2 { get; set; }
}
正如您所看到的,骑师丝绸的每个元素都有不同的图案和颜色。每个元素的主要部分是[Item] Colour1,模式用[Item] Colour2填充。
SilksControl
的基本构成是ViewBox
,其中包含Canvas
,而Path
又包含许多Path
个。我将每个模式绘制为Canvas
个CapPattern
内的BodyPattern
。
Here's a picture.在此示例中,Plain
和ArmPattern
设置为Chevrons
,Path
设置为Canvas.Top
。
我正在尝试找出基于WPF数据绑定设置模式的最佳方法。但是,有一个问题:每个模式Canvas.Left
都有不同的pthCapPattern = CapPatterns[SilksModel.CapPattern]
和CapPatterns
值和维度。
“最好的方式”是指一些简单,易读且易于实现的东西。
Dictionary<CapPattern,Path>
,其中SilksModel.[Item]Pattern
是Path
,或者可能从资源中访问它
Path.Data
StreamGeometry
并更改每个{J}的可见性
StreamGeometry
属性的方法(可能在资源中有一些Canvas
,使用转换器从枚举转到{{ 1}})
<Canvas x:Name="SPatterns" Height="173" Canvas.Left="6.8" Canvas.Top="107" Width="236.6">
<Path x:Name="Chevrons" Fill="{Binding SilksModel.BodyColour2, Converter={StaticResource DBColourToColorConverter}, ElementName=root" Height="134.125" Canvas.Left="1.087" Stretch="Fill" Stroke="Black" Canvas.Top="21.667" Width="234.168" Data="M21.750001,94.749999 L34.000002,117.66218 30.625003,133.62501 17.000006,113.32909 0.5,126.75 3.2500048,108.125 z M212.418,93.416999 L230.918,106.79199 233.668,125.41701 217.168,111.99609 203.543,132.292 200.168,116.32917 z M32.25,48.374999 L44.250004,72.249999 40.625004,90.249999 28.000003,68.581336 7.750001,82.249999 11.665709,64.166339 z M201.918,47.041991 L222.50229,62.833335 226.418,80.916991 206.168,67.248336 193.543,88.916999 189.918,70.916991 z M41,1.8329993 L55.000002,28.166337 51.66667,45.832999 37.333336,23.499837 16.666001,37.417269 21.66571,19.418135 z M193.168,0.5 L212.50229,18.085143 217.502,36.084262 196.83467,22.166836 182.50133,44.499991 179.168,26.833333 z" />
<!-- More SleevePatterns -->
</Canvas>
偏移量。 :(因此,解决方案4是我首选的解决方案,但正如我所提到的,我不知道如何做到这一点,而我的谷歌搜索技巧无法提供任何有用的东西。如果做不到这一点,解决方案2将是下一个最好的事情,但我不知道任何容器提供与画布相同的功能并提供绑定到子/内容。
{{1}}
答案 0 :(得分:1)
这可能不是最干净的解决方案,但这样的事情对你有效(显然你会将几何初始化从构造函数中移出)?
您可以创建建议的Dictionary<CapPattern,Path>
对象,并使用您的路径信息填充该对象,同时将Transform
应用于Geometry
,以便为其提供所需的尺寸/偏移量,相对于Canvas
。
public partial class Horses : UserControl, INotifyPropertyChanged
{
public enum CapPattern { ChevronPattern, SomeOtherPattern };
public Dictionary<CapPattern, Geometry> Patterns { get; set; }
private Geometry currentPath;
public Geometry CurrentPath
{
get { return this.currentPath; }
set
{
this.currentPath = value;
NotifyPropertyChanged();
}
}
public Horses()
{
Patterns = new Dictionary<CapPattern, Geometry>();
Patterns.Add(
CapPattern.ChevronPattern,
Geometry.Combine(
Geometry.Parse("M21.750001,94.749999 L34.000002,117.66218 30.625003,133.62501 17.000006,113.32909 0.5,126.75 3.2500048,108.125 z M212.418,93.416999 L230.918,106.79199 233.668,125.41701 217.168,111.99609 203.543,132.292 200.168,116.32917 z M32.25,48.374999 L44.250004,72.249999 40.625004,90.249999 28.000003,68.581336 7.750001,82.249999 11.665709,64.166339 z M201.918,47.041991 L222.50229,62.833335 226.418,80.916991 206.168,67.248336 193.543,88.916999 189.918,70.916991 z M41,1.8329993 L55.000002,28.166337 51.66667,45.832999 37.333336,23.499837 16.666001,37.417269 21.66571,19.418135 z M193.168,0.5 L212.50229,18.085143 217.502,36.084262 196.83467,22.166836 182.50133,44.499991 179.168,26.833333 z"),
Geometry.Empty,
GeometryCombineMode.Union,
new TranslateTransform(0, 0)));
Patterns.Add(
CapPattern.SomeOtherPattern,
Geometry.Combine(
Geometry.Parse("M21.750001,94.749999 L34.000002,117.66218 30.625003,133.62501 17.000006,113.32909 0.5,126.75 3.2500048,108.125 z M212.418,93.416999 L230.918,106.79199 233.668,125.41701 217.168,111.99609 203.543,132.292 200.168,116.32917 z M32.25,48.374999 L44.250004,72.249999 40.625004,90.249999 28.000003,68.581336 7.750001,82.249999 11.665709,64.166339 z M201.918,47.041991 L222.50229,62.833335 226.418,80.916991 206.168,67.248336 193.543,88.916999 189.918,70.916991 z M41,1.8329993 L55.000002,28.166337 51.66667,45.832999 37.333336,23.499837 16.666001,37.417269 21.66571,19.418135 z M193.168,0.5 L212.50229,18.085143 217.502,36.084262 196.83467,22.166836 182.50133,44.499991 179.168,26.833333 z"),
Geometry.Empty,
GeometryCombineMode.Union,
new TranslateTransform(20, 30)));
InitializeComponent();
}
// INotifyPropertyChanged implementaton.
}
在我的模拟中,我已经从该字典中填充了ComboBox
,该字典设置了一个属性CurrentPath
,该属性绑定到Path
上的Canvas
:< / p>
<Grid>
<StackPanel>
<ComboBox ItemsSource="{Binding Path=Patterns}"
SelectedValue="{Binding Path=CurrentPath}"
SelectedValuePath="Value"
DisplayMemberPath="Key"/>
<Canvas>
<Path Data="{Binding Path=CurrentPath}" Stroke="Black" StrokeThickness="1" />
</Canvas>
</StackPanel>
</Grid>
您将保留Fill
和其他属性的绑定。
另一种方法可能是制作一个小Class
,其中包含Path
个信息,以及所需的Top
,Left
,Transform
或任何其他信息需要定位模式。然后,您可以以与上述类似的方式将这些对象的列表绑定到ComboBox
,并将Canvas
和Path
上的所有必需属性绑定到当前所选对象的属性
修改强>
您也可以按以下方式在ResourceDictionary
中配置转换:
<Path x:Name="Chevrons" Fill="{Binding SilksModel.BodyColour2, Converter={StaticResource DBColourToColorConverter}, ElementName=root" Data="M21.750001,94.749999 L34.000002,117.66218 30.625003,133.62501 17.000006,113.32909 0.5,126.75 3.2500048,108.125 z M212.418,93.416999 L230.918,106.79199 233.668,125.41701 217.168,111.99609 203.543,132.292 200.168,116.32917 z M32.25,48.374999 L44.250004,72.249999 40.625004,90.249999 28.000003,68.581336 7.750001,82.249999 11.665709,64.166339 z M201.918,47.041991 L222.50229,62.833335 226.418,80.916991 206.168,67.248336 193.543,88.916999 189.918,70.916991 z M41,1.8329993 L55.000002,28.166337 51.66667,45.832999 37.333336,23.499837 16.666001,37.417269 21.66571,19.418135 z M193.168,0.5 L212.50229,18.085143 217.502,36.084262 196.83467,22.166836 182.50133,44.499991 179.168,26.833333 z" Stroke="Black" StrokeThickness="1">
<Path.RenderTransform>
<TranslateTransform X="20" Y="120"/>
</Path.RenderTransform>
</Path>