C# 使用多值转换器更新WPF中画布上的弧段点
所以我正在做一项任务,我们应该用C#和WPF制作一个Mii生成器,我已经做了所有的工作,但问题是我们应该尽可能少地使用代码,而使用绑定。我已经为其他一些部分创建了一个ValueConverter,它们工作得很好,但是当我尝试使用多重绑定更新弧段的点时(我需要一些值来保持所有内容居中),该点保持静止 以下是不带多绑定的工作代码: XAML: 有人知道怎么做吗?当我打印出这些值时,多重绑定接收到的所有信息都是正确的,我尝试返回new Point()和格式化的字符串,但似乎没有任何效果 进一步信息:没有生成错误,我在窗口中找到了MultiValueConverter.Resources标记,传递到多重绑定的所有值都来自滑块,当我使用相同的多重绑定xaml代码将字符串返回到标签时,它们都是正确的(如下图所示):C# 使用多值转换器更新WPF中画布上的弧段点,c#,wpf,xaml,multibinding,imultivalueconverter,C#,Wpf,Xaml,Multibinding,Imultivalueconverter,所以我正在做一项任务,我们应该用C#和WPF制作一个Mii生成器,我已经做了所有的工作,但问题是我们应该尽可能少地使用代码,而使用绑定。我已经为其他一些部分创建了一个ValueConverter,它们工作得很好,但是当我尝试使用多重绑定更新弧段的点时(我需要一些值来保持所有内容居中),该点保持静止 以下是不带多绑定的工作代码: XAML: 有人知道怎么做吗?当我打印出这些值时,多重绑定接收到的所有信息都是正确的,我尝试返回new Point()和格式化的字符串,但似乎没有任何效果 进一步信息:没
我是否需要保留工作代码并处理它,或者是否有方法使用多重绑定更新ArcSegment的点?好的,我已经解决了;我制作了一个完整的moutconverter:IMultiValueConverter并在转换器内创建了PathGeometry,然后返回它,链接到XAML和C#MultiBind好的,我已经找到了答案;我制作了一个全口转换器,在转换器内创建了PathGeometry,然后返回它,链接到下面的XAML和C#MultiBind:多值转换器应该可以工作。如果不能可靠地再现问题,就不可能帮助您解决问题。我建议不要使用
UpdateSourceTrigger
;实际上,绑定应该是Mode=“OneWay”
,因为您不能从目标转换到源。不要忘记绑定错误会写入调试输出;当您无法找出绑定不起作用的原因时,通常会有有用的信息。
<Path Stroke="Black" StrokeThickness="3">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure x:Name="LeftMouthCorner" StartPoint="221,190" IsClosed="False">
<ArcSegment x:Name="RightMouthCorner" Point="291,190" Size="{Binding ElementName=MouthHappinessSlider, Path=Value, Converter={StaticResource HappinessConverter}}">
</ArcSegment>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
private void MouthWidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
MouthWidthLabel.Content = String.Format("Mouth Width: {0}", MouthWidthSlider.Value);
if (MouthWidthSlider != null && MouthHeightSlider != null && HeadYPosSlider != null)
{
LeftMouthCorner.StartPoint = new Point(((myCanvas.ActualWidth / 2) - MouthWidthSlider.Value), (HeadYPosSlider.Value + MouthHeightSlider.Value));
RightMouthCorner.Point = new Point(((myCanvas.ActualWidth / 2) + MouthWidthSlider.Value), (HeadYPosSlider.Value + MouthHeightSlider.Value));
}
}
<Path Stroke="Black" StrokeThickness="3">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure x:Name="LeftMouthCorner" StartPoint="221,190" IsClosed="False">
<ArcSegment x:Name="RightMouthCorner" Size="{Binding ElementName=MouthHappinessSlider, Path=Value, Converter={StaticResource HappinessConverter}}">
<ArcSegment.Point>
<MultiBinding Converter="{StaticResource RMCConverter}" UpdateSourceTrigger="PropertyChanged">
<Binding ElementName="HeadYPosSlider" Path="Value" />
<Binding ElementName="MouthHeightSlider" Path="Value" />
<Binding ElementName="MouthWidthSlider" Path="Value" />
<Binding ElementName="myCanvas" Path="Width" />
</MultiBinding>
</ArcSegment.Point>
</ArcSegment>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
public class RMCConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
//HYP / MHS / MWS / mCW
var hyp = values[0];
var mhs = values[1];
var mws = values[2];
var mcw = values[3];
double HeadYPos = (double)hyp,
MouthHeight = (double)mhs,
MouthWidth = (double)mws,
CanvasWidth = (double)mcw;
return new Point(((CanvasWidth / 2) + MouthWidth), (HeadYPos + MouthHeight));
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
<Label>
<Content>
<MultiBind-Code from above goes here>
</Content>
</Label>