Обновление точки сегмента дуги на холсте в WPF с использованием MultiValueConverter

Поэтому я работаю над заданием, в котором мы должны создать Mii Maker на C# и WPF, и у меня все работает, но каватия в том, что мы должны использовать как можно меньше кода и использовать привязку вместо. Я создал ValueConverter для нескольких других частей, и они работали нормально, но когда я пытаюсь обновить точку ArcSegment с использованием MultiBind (мне нужно несколько значений, чтобы держать все по центру), точка остается неподвижной.

Вот рабочий код без мульти-привязки:

XAML:

<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>

C#:

    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));
        }
    }

Я хочу удалить этот метод и извлечь его в MultiValueConverter (или два, так как дуга имеет две точки) и обновить точку напрямую вместо использования метода value_Changed, например, так:

XAML:

            <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>

C# MultiValueConverter:

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();
    }
}

Кто-нибудь знает, как это сделать? Когда я распечатываю значения, MultiBind получает все правильно, и я пытался вернуть и новую Point(), и отформатированную строку, но, похоже, ничего не работает.

Дополнительная информация: ошибок сборки нет, у меня есть MultiValueConverter в теге Window.Resources, все значения, передаваемые в мультибинд, взяты из ползунков, и все они верны, когда я вернул строку в метку с помощью тот же код xaml для мультибинд (например, так):

 <Label>
     <Content>
         <MultiBind-Code from above goes here>
     </Content>
 </Label>

Мне нужно сохранить рабочий код и просто разобраться с ним, или есть ли способ обновить точку ArcSegment с помощью MultiBind?

1 ответ

Итак, я понял это; Я сделал полный MouthConverter: IMultiValueConverter и создал PathGeometry внутри конвертера, а затем вернул его, ссылку на XAML и C# MultiBind здесь

Другие вопросы по тегам