【问题标题】:Update Arc Segment Point on Canvas in WPF using MultiValueConverter使用 MultiValueConverter 在 WPF 中的画布上更新弧段点
【发布时间】:2015-11-17 01:42:10
【问题描述】:

所以我正在做一个任务,我们应该在 C# 和 WPF 中制作一个 Mii Maker,我已经完成了所有工作,但要注意的是我们应该使用尽可能少的代码,并改用绑定。我为其他几个部分创建了一个 ValueConverter,它们工作得很好,但是当我尝试使用 MultiBind 更新 ArcSegment 的点时(我需要一些值来保持所有内容居中),该点保持静止。

这是没有多重绑定的工作代码:

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(或两个,因为弧有两个点),并直接更新 Point 而不是使用 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# 多值转换器:

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 接收到的值时,一切都是正确的,并且我尝试返回 new Point() 和格式化的字符串,但似乎没有任何效果。

更多信息:没有构建错误,我在 Window.Resources 标记中有 MultiValueConverter,传递到 multibind 的所有值都来自滑块,当我将字符串返回到为多重绑定使用相同的 xaml 代码进行标记(像这样):

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

我需要保留工作代码并直接处理它,还是有办法使用 MultiBind 更新 ArcSegment 的点?

【问题讨论】:

  • 好的,我想通了;我制作了一个完整的 MouthConverter 并在转换器内创建了 PathGeometry,然后返回它,链接到下面的 XAML 和 C# MultiBind:link
  • MultiValueConverter 应该可以工作。如果没有可靠地重现问题的a good, minimal, complete code example,则无法帮助您解决它。我建议不要使用UpdateSourceTrigger;实际上,绑定应该只是Mode="OneWay",因为您不能从目标转换为源。不要忘记将绑定错误写入调试输出;当您无法弄清楚绑定不起作用的原因时,通常会有有用的信息。

标签: c# wpf xaml multibinding imultivalueconverter


【解决方案1】:

好的,所以我想通了;我做了一个完整的 MouthConverter : IMultiValueConverter 并创建了 PathGeometry inside 转换器,然后返回它,链接到 XAML 和 C# MultiBind here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多